1

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

4 回答 4

3

C++ 标准中没有要求自动(您称为stack)变量以特定顺序或位置布置(只要满足对齐要求)。

于 2017-01-06T15:19:03.830 回答
0

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

并非如此,对于任何健全的优化编译器,这两个函数消耗的堆栈内存都应该是相同的……现代 C++ 编译器在某些优化方面确实非常激进。

除了合适的对齐方式外,C++ 不会为函数中的自动变量强加内存地址排序。虽然这是真的,但编译器不得更改程序的可观察行为。

我猜你是在谈论structs 和classes ,其中变量的内存布局和地址顺序是声明的。

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

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


1:即使是堆栈指针也被大多数编译器对齐。

于 2017-01-06T15:21:17.870 回答
0

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

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

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

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

于 2017-01-06T16:04:18.877 回答
0

感谢您的帮助,我现在也找到了对我正在寻找的逻辑的不错描述,对于任何有兴趣的人,我将在此处发布链接: http: //www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html http ://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html

于 2017-01-06T19:09:22.667 回答