是否有任何方法可以使编译器暗示某些对象可能具有更多的静态行为,并在堆栈上分配内容而不是堆?
例如,在某些函数中,字符串对象的大小可能恒定。
我问这个问题是因为我试图通过使用OpenMP来提高应用程序的性能。我已经将串行部分的时间从50秒改进到了20秒,并通过并行处理提高到了12秒(提到大多数代码可以并行运行)。我正在尝试继续改进。我认为一个局限性是与同一过程中动态内存的连续分配和释放有关。
到目前为止,串行优化与合并到更多的ANSI C方法和更硬编码的变量分配有关(它们是动态分配的,但考虑到最坏的情况,因此所有分配一次)。
现在,我几乎陷入了困境,因为我已经到达了具有很多C++方法的部分代码。

最佳答案

标准的std::basic_string模板(其中std::string是专门化的模板)接受分配器作为其第三个参数,并且您可以提供自己的基于堆栈的分配器,而不是std::allocator,但这会很棘手(您可以使用alloca(3)并确保所有分配是内联的;如果不是,则alloca将无法按您期望的方式工作。)我不推荐这种方法。

一种更可行的方法是拥有自己的arena or region based分配器。参见std::allocator_traits

您可能只需要在足够大的本地缓冲区上使用C snprintf(3)(例如char buf[128];)

关于c++ - g++编译器提示要在堆栈上分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26731446/

10-11 23:21
查看更多