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

Chr*_*ris 6 c++ memory-management overhead compiler-optimization

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

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

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

Ale*_*ler 6

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

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

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

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