C++可变内存分配

Mic*_*man 4 c++ memory-management compiler-theory conditional-compilation new-operator

这些主要是编译器设计问题.当您的编译器编译它时,例如:

int * pData = new int[256];

如何即时分配内存?编译器是否调用为您分配内存的OS例程,还是编译为您分配内存的函数?

此外,当你写这样的东西:

if (x == 5)
    int y;
Run Code Online (Sandbox Code Playgroud)

由于内存不是在运行时分配的,我假设数据占用了程序数据段的一些空间.由于编译器无法确定int y;分支是否将在运行时执行,因此是否为变量保留的内存是否int y;被执行?如果它是保留的,那么mem分配块中可能执行也可能不执行的任何变量的内存效率是否更高?

谢谢

Eva*_*ran 6

对于第一个问题:new编译器遇到运算符时,例如:

int * pData = new int[256];
Run Code Online (Sandbox Code Playgroud)

它有效地发出如下代码:

int *pData = reinterpret_cast<int*>(::operator new(256 * sizeof(int)));
// the compiler may also choose to reserve extra space here or elsewhere to
// "remember" how many elements were allocated by this new[] so delete[] 
// can properly call all the destructors too!
Run Code Online (Sandbox Code Playgroud)

如果应该调用构造函数,那么也会调用它(在这个例子中,我相信没有构造函数被调用).

operator new(std::size_t)是一个由标准库实现的功能,通常但不总是,它将归结为一个malloc调用.

malloc将不得不进行系统调用,从操作系统请求内存.由于OS分配器通常使用较大的固定大小的内存块,malloc因此每次都不会进行此调用,只有当它已经耗尽了当前的内存时.


对于第二个问题:对于局部变量,它实际上取决于编译器.标准没有提到堆栈.但是,很可能您使用的是运行通用操作系统并使用通用编译器的通用体系结构:-).

因此,对于共同的情况下,编译器将通常在函数调用的所有的局部变量的开始通过相应地调节叠层或保留寄存器为它们预留空间,如果它可以(寄存器是优选的选择,因为它是快).

然后(在c ++中),当遇到变量时,它将调用构造函数.从理论上讲,它可以根据需要调整堆栈,但这对于证明正确且效率较低会很复杂.通常保留堆栈空间是单个指令,因此一次完成所有操作都是非常理想的.