Tag: 堆栈分配

C99 VLA的C ++替代(目标:保持性能)

我将一些C99代码移植到C ++中,这些代码大量使用可变长度数组(VLA)。 我用一个在堆上分配内存的数组类来replaceVLA(堆栈分配)。 性能下降幅度很大,下降了3.2倍(见下面的基准)。 我可以在C ++中使用什么样的VLA快速replace? 我的目标是在重写C ++代码时将性能降到最低。 我build议的一个想法是编写一个在类中包含一个固定大小的存储(即可以堆栈分配)的数组类,并将其用于小型数组,并自动切换到大型数组的堆分配。 我的这个实现是在post的最后。 它工作得很好,但我仍然无法达到原始C99代码的性能。 要接近它,我必须增加这个固定大小的存储( MSL以下)到我不舒服的大小。 我不想在堆栈上分配太大的数组, 即使是那些不需要它的小数组,因为我担心它会触发堆栈溢出。 C99 VLA实际上不太容易这样做,因为它永远不会使用比需要更多的存储空间。 我来到std::dynarray ,但我的理解是,它没有被接受到标准(还?)。 我知道clang和gcc支持C ++中的VLA,但我也需要它与MSVC一起工作。 实际上,更好的可移植性是C ++重写的主要目标之一(另一个目标是将程序本来就是一个命令行工具)编译成可重用的库。 基准 MSL是MSL组大小,高于此大小我切换到堆分配。 一维和二维数组使用不同的值。 原始C99代码:115秒。 MSL = 0(即堆分配):367秒(3.2x)。 1D-MSL = 50,2D-MSL = 1000:187秒(1.63x)。 1D-MSL = 200,2D-MSL = 4000:143秒(1.24x)。 1D-MSL = 1000,2D-MSL = 20000:131(1.14x)。 增加MSL进一步提高了性能,但最终程序将开始返回错误的结果(我认为是由于堆栈溢出)。 这些基准与OS X上的clang 3.7一样,但是gcc 5显示了非常相似的结果。 码 这是我现在使用的“smallvector”实现。 我需要一维和二维vector。 我切换到大小MSL以上的堆分配。 template<typename […]