Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有类作用域的动态分配堆栈内存 >几个编译器支持C++的扩展,这样就可以动态地在堆栈上分配内存。例如,g++支持alloca()以及VLAs。所有这些扩展都附带一个警告,即动态分配的内存在调用函数的作用域末尾被“释放”。(编辑:为了澄清,我在“deallocate”周围使用引号,因为实际发生的是编译器正在减少/增加堆栈指针,因此alloca()需要编译器支持。)这意味着使用alloca()分配内存在类的构造函数中,一旦构造函数返回,就会取消分配_C++_Memory Management_Stack_Alloca_Variable Length Array - Fatal编程技术网

具有类作用域的动态分配堆栈内存 >几个编译器支持C++的扩展,这样就可以动态地在堆栈上分配内存。例如,g++支持alloca()以及VLAs。所有这些扩展都附带一个警告,即动态分配的内存在调用函数的作用域末尾被“释放”。(编辑:为了澄清,我在“deallocate”周围使用引号,因为实际发生的是编译器正在减少/增加堆栈指针,因此alloca()需要编译器支持。)这意味着使用alloca()分配内存在类的构造函数中,一旦构造函数返回,就会取消分配

具有类作用域的动态分配堆栈内存 >几个编译器支持C++的扩展,这样就可以动态地在堆栈上分配内存。例如,g++支持alloca()以及VLAs。所有这些扩展都附带一个警告,即动态分配的内存在调用函数的作用域末尾被“释放”。(编辑:为了澄清,我在“deallocate”周围使用引号,因为实际发生的是编译器正在减少/增加堆栈指针,因此alloca()需要编译器支持。)这意味着使用alloca()分配内存在类的构造函数中,一旦构造函数返回,就会取消分配,c++,memory-management,stack,alloca,variable-length-array,C++,Memory Management,Stack,Alloca,Variable Length Array,在类中,构造函数通过一些非平凡的步骤来确定要分配多少内存,这种限制变得很难处理。该类的用户必须在构造该类的函数中分配内存,从而公开一些不应该公开的内部构件。此外,在我的代码中设置变通方法以便能够使用alloca()或VLAs通常是不方便的 你能想出一些方法来绕过这个限制,这样我就可以使用alloca()、VLAs或其他一些语言扩展,这样就可以在类中分配内存并具有类作用域吗?不,这是不可能的。一个类不能分配函数本地内存——这是没有意义的 但是,您可以使用适当的自定义分配器(如内存竞技场)实现极快的

在类中,构造函数通过一些非平凡的步骤来确定要分配多少内存,这种限制变得很难处理。该类的用户必须在构造该类的函数中分配内存,从而公开一些不应该公开的内部构件。此外,在我的代码中设置变通方法以便能够使用
alloca()
或VLAs通常是不方便的


你能想出一些方法来绕过这个限制,这样我就可以使用
alloca()
、VLAs或其他一些语言扩展,这样就可以在类中分配内存并具有类作用域吗?

不,这是不可能的。一个类不能分配函数本地内存——这是没有意义的


但是,您可以使用适当的自定义分配器(如内存竞技场)实现极快的堆分配,达到足够快的程度。您需要记住的是,
new
是内存分配的核弹头-它必须支持任何分配大小和任何分配/解除分配模式。一些更具体的东西可以运行得更快,甚至可以与堆栈分配内存相媲美。在VisualStudio2010上,我甚至可以让它比alloca执行得更快。不,这是不可能的。一个类不能分配函数本地内存——这是没有意义的


但是,您可以使用适当的自定义分配器(如内存竞技场)实现极快的堆分配,达到足够快的程度。您需要记住的是,
new
是内存分配的核弹头-它必须支持任何分配大小和任何分配/解除分配模式。一些更具体的东西可以运行得更快,甚至可以与堆栈分配内存相媲美。在Visual Studio 2010上,我甚至可以让它执行得比alloca快。

有什么原因必须使用堆栈来分配而不是堆?@void pointer从堆中获取一块内存,并将其用作自己的有效堆栈。@void pointer:堆的速度可能会让您感到惊讶。一些变通方法是:(1)使用静态函数计算调用函数必须保留的空间量;(2)使用宏“构造函数”。但实际上,只需使用堆。我真正想这样做的原因是确定堆分配与我的应用程序中的alloca()相比的准确程度。@void pointer:在这种情况下,还要测试自定义堆栈分配器。是否有理由必须使用堆栈而不是堆进行分配?@void pointer从堆中获取一块内存,并将其用作您自己的有效堆栈。@void pointer:堆的速度可能会让您感到惊讶。一些变通方法是:(1)使用静态函数计算调用函数必须保留的空间量;(2)使用宏“构造函数”。但实际上,只要使用堆就行了。我之所以要这样做,是为了准确地确定堆分配与我的应用程序中的alloca()相比有多大。@void pointer:在这种情况下,还要测试一个自定义堆栈分配器。嗯,这真的很有趣。我想我有一些基准测试要做。嗯,那真的很有趣。我想我需要做一些基准测试。