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

Stack memory allocation of variables in c++

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

我知道编译器将它们一个接一个地放在堆栈上,但它背后必须有一些逻辑,我搜索了 Google 几个小时但我找不到任何东西。

例如:

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;
}

C++ 标准没有要求 automatic(你所谓的 stack)变量按特定顺序排列或位置(只要满足 alignment 要求)。

This should occupy more memory than the one below because of the way the c++ compiler is storing in the memory.

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

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

我猜你想谈论 structs 和 classes 变量的内存布局和地址顺序是 as declared.

How does the c++ compiler organize the variables that are initialized in a function to store them so the computer will find them the fastest way?

实际上,在 C++ 中对自动变量的每次访问都是相对于 stack pointer1 的简单指针偏移(编译器直接放置在登记)。此外,为了加快此类自动变量的速度(无顺序):

  • 编译器消除了dead variables

  • 编译器会找到最好的顺序来存储它们每一个以满足suitable alignment

  • 编译器可能使用CPUregister directly depending on what it's Register Allocation算法决定

  • 编译器可能会将某些变量集中到一个 vector 寄存器中,并使用向量指令,前提是它会产生正确的结果。

  • ...等等。


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

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

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

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

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

感谢您的帮助,我现在还找到了对我正在寻找的逻辑的一个不错的描述,对于任何感兴趣的人,我将 post link 放在这里: http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html