在c ++中堆栈变量的内存分配

时间:2017-01-06 15:11:42

标签: c++ variables compiler-construction stack static-memory-allocation

c ++编译器如何组织在函数中初始化的变量来存储它们,以便计算机能够以最快的方式找到它们?

据我所知,编译器会在堆栈中一个接一个地放置它们,但是它背后必须有一些逻辑,我在谷歌搜索了几个小时,但我找不到任何东西。

例如:

int main()
{
    float a;
    int b;
    char c;
    double d;
}

由于c ++编译器存储在内存中的方式,这应占用比下面更多的内存。

当然,使用的确切位是相同的,但在下面的示例中它们应该以更有效的顺序存储。在下一个例子中,编译器会在内存中存储这些变量吗?据我所知,变量总是存储在一个块上,(logical number) % (number of bytes the datatype) = 0

int main()
{
    char c;
    int b;
    float a;
    double d;
}

4 个答案:

答案 0 :(得分:3)

C ++标准中没有要求自动(你称之为 stack )变量按特定顺序或位置排列(只要{{ 3}}要求得到满足。)

答案 1 :(得分:0)

  

由于这种方式,这应该比下面的内存占用更多​​的内存   c ++编译器存储在内存中。

实际上,两个函数消耗的堆栈内存应该与any sane optimizing compiler相同...现代C ++编译器在某些优化方面非常积极。

除了合适的对齐外,C ++不对函数中的自动变量强加内存地址排序。虽然这是真的,但编译器不得更改程序的the observable behavior

我想您正在尝试讨论structclass es,其中变量的内存布局和地址排序为as declared

  

c ++编译器如何组织初始化的变量   在存储它们的功能中,计算机会发现它们最快   方式是什么?

实际上,C ++中对自动变量的每次访问都是相对于stack pointer 1 的简单指针偏移(编译器直接放在寄存器中的变量除外)。此外,为了加速这种自动变量(无序):

1 :大多数编译器甚至堆栈指针都是aligned

答案 2 :(得分:0)

注册和优化。
变量的最有效访问是消除它们。许多编译器将优化掉未使用的变量。

如果在本地使用变量,编译器可能会决定将变量放在寄存器中。寄存器是变量的最有效访问。

堆栈是一种方便的数据结构,用于分配局部变量。编译器可以通过更改堆栈指针来销毁堆栈上的变量。使用堆栈的实现通常具有指向堆栈顶部的指针(分配下一个变量的位置)。分配就像通过常量调整指针一样简单(这是一个算术运算)。

请记住,编译器使用堆栈没有要求

答案 3 :(得分:0)

感谢您的帮助,我现在也对我正在寻找的逻辑描述了一个不太糟糕的描述,对于任何被插入的人,我会在这里发布链接: http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html