内存[de]分配成本和潜在的编译器优化(c ++)

时间:2011-04-11 18:36:46

标签: c++ memory-management compiler-optimization overhead

内存[de]分配的成本是否明确定义?如果成本取决于所使用的特定编译器,是否有一般的方式实现内存[de]分配,以便我可以合理地假设成本?

编译器是否能够优化以下代码,使得对“new”的调用只进行一次?

char * arr = NULL;
for (size_t i = 0; i < 5000000000; ++i)
{
    arr = new char[100000000]
    ... // Process things here
    delete []arr;
}

3 个答案:

答案 0 :(得分:6)

编译器几乎肯定无法执行此优化。在最低级别,存储分配归结为调用库函数,例如malloc(以及更深层次的OS API)。对于编译器,假设可以省略单个malloc/free对并重用它们的存储是不安全的,因为它们的实现应该在优化器的范围之外。

除此之外,我认为这对优化器来说不是一个好工作。这是程序员在没有特别努力的情况下可以做的事情。

内存分配/释放没有标准化的成本。通常,分配/解除分配时间可能会有很大差异(例如,如果强制用户空间堆实现从OS内核的内存管理器中获取新页面,则需要更长的时间)。

一个合理的经验法则是小分配最有可能比大分配快,分配应该比分配慢。

答案 1 :(得分:0)

编译器可能有一些设置来优化你的代码片段(有一些错误),但你必须告诉编译器你是在优化速度还是大小。标准中没有任何内容表明所需的性能程度。

我会考虑分配和释放,因为我不想依赖编译器。

此外,由于标准C ++语言中没有垃圾收集,因此您的分配和释放可能会对碎片内存造成严重破坏(或者降低执行速度)。

顺便说一下,你的错误是将变量'i'(一个整数)与一个浮点数量“5000000000.0”进行比较。请注意小数点。良好的编程习惯是将整数与整数和浮点与浮点进行比较。

答案 2 :(得分:0)

分配char [100000000]的时间比将所有元素设置为0(在任何情况下构造函数应该做什么)的时间要小。如果你的代码写入每个单元格分配比其他任何东西都便宜得多。

我认为没有编译器可以使这个工作并且只调用构造函数。