C ++可变内存分配

这些主要是编译器设计问题。 当你的编译器编译这个时,例如:

int * pData = new int[256];

内存如何分配? 编译器是否调用了为您分配内存的OS例程,或者是编译过的为您分配内存的函数?

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

if (x == 5)
    int y;

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

哦,谢谢


对于第一个问题:如果你的例子中遇到了编译器遇到的new运算符:

int * pData = new int[256];

它有效地发出代码,如下所示:

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!

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

operator new(std::size_t)是一个由标准库实现的函数,通常但不总是 ,它会归结为一个malloc调用。

malloc将不得不进行系统调用,以从操作系统请求内存。 由于OS分配器通常使用更大的固定大小的内存块,所以malloc不会每次都调用这个调用,只有当它耗尽了当前拥有的内存时。


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

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

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


内存如何分配? 编译器是否调用了为您分配内存的OS例程,或者是编译过的为您分配内存的函数?

在大多数实现中,它们有一些是这两者的组合。 通常有一个操作系统服务用于为您的进程提供内存块,还有一些运行时代码或标准库,用于在应用程序内部以更细粒度的比例管理这些内存块。

是为变量保留的内存,无论是否为“int y;” 执行? 如果不管它是否保留,mem分配块中可能执行或可能不执行的任何变量的内存效率会更高吗?

通常情况下,no - 只有在执行适当的代码时才会分配y的空间。 具有自动存储类的变量通常在堆栈中,因此为它们创建空间与修改堆栈指针一样简单。 也就是说,编译器在这种情况下可以做任何事情,所以检查工具链的输出是确保知道的唯一方法。


局部变量(int y)在堆栈上分配。

对于指针也是一样,然而'new'ed表达式是在堆上分配的,通​​常是通过一个malloc调用。 确切的方法和堆布局是实现定义的。

数据段中只有全局静态数据。

示例int y将被优化,因为它没有被使用。

与例如C#不同,C ++不允许为一个变量缩小范围,所以将一个短暂的本地包装在{SomeClass y; }可以提供帮助,所以它会被破坏得更早

但是,我很确定,对于简单类型(如int),不存在这样的限制,因为永远不会有这些限制

链接地址: http://www.djcxy.com/p/78529.html

上一篇: C++ Variable Memory Allocation

下一篇: How to allocate aligned memory only using the standard library?