在堆栈上调用大量对象的构造函数

时间:2011-02-04 01:57:10

标签: c++ arrays object constructor

我正在修改一些C ++源代码,我注意到作者真的竭尽全力在堆栈上分配所有东西。最有可能获得解除分配的好处(还有任何性能优势吗?)。

我想保持相同的一致性,但我需要创建大量的对象,例如:

Object os[1000] = {Object(arg), Object(arg), ....};

不会削减它。搜索它似乎是一种方法只是:

vector<Object> os(1000, Object(arg));

这仍然在堆上分配但是像堆栈一样解除分配(从我在其他帖子中读到的内容)。我只是想知道是否有其他选项,因为这似乎是一个语法问题。也许一个聪明的#define人知道。

4 个答案:

答案 0 :(得分:1)

不应将堆栈用于大块内存。您只需支付更高的堆分配价格,以换取访问更多内存的好处。另一种选择是声明一个具有静态存储持续时间的数组,但这有其他缺点(不是重入,不是线程安全的)。一切都是权衡。

在任何情况下,在分配复杂对象时,调用1000个构造函数的成本将使分配器中花费的时间相形见绌。只需使用std::vector,除非您有显示性能问题的分析器数据。

答案 1 :(得分:1)

是的,还有其他选择。您可以使用alloca之类的内容。这将为您提供堆栈分配和自动免费,但不能自动构建或销毁。您需要使用析构函数的放置新显式和显式调用。

是的,可能有一个性能优势,但你也要求放弃堆栈,这种模式不像vector解决方案那样是异常安全的(也就是说,如果您分配的对象有一个非平凡的析构函数。)

答案 2 :(得分:0)

一般来说,在堆栈上分配大量数据是个坏主意。大多数操作系统上的堆栈都是一个临时空间,而且大小相当有限。为对象分配大量堆栈空间可以快速消耗所有可用的堆栈空间,当某些东西试图在堆栈上再分配一些东西时会导致段错误或其他异常(例如,函数调用的返回地址)。

就其他选项而言,你已经注意到了一些.. std :: vector,以及boost :: array就是这样的例子。

答案 3 :(得分:0)

这应该有效:

Object os[1000];
os[0] = Object(args);
std::copy(os, os + 999, os + 1);

这会创建数组,初始化一个对象,然后循环遍历,用最后一个元素初始化每个元素。

当然,你可能不应该使用它。即使它有效也似乎是一个坏主意,即使Object os[1000]不会给你带来问题。