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;
}
答案 0 :(得分:3)
C ++标准中没有要求自动(你称之为 stack )变量按特定顺序或位置排列(只要{{ 3}}要求得到满足。)
答案 1 :(得分:0)
由于这种方式,这应该比下面的内存占用更多的内存 c ++编译器存储在内存中。
实际上,两个函数消耗的堆栈内存应该与any sane optimizing compiler相同...现代C ++编译器在某些优化方面非常积极。
除了合适的对齐外,C ++不对函数中的自动变量强加内存地址排序。虽然这是真的,但编译器不得更改程序的the observable behavior。
我想您正在尝试讨论struct
和class
es,其中变量的内存布局和地址排序为as declared。
c ++编译器如何组织初始化的变量 在存储它们的功能中,计算机会发现它们最快 方式是什么?
实际上,C ++中对自动变量的每次访问都是相对于stack pointer 1 的简单指针偏移(编译器直接放在寄存器中的变量除外)。此外,为了加速这种自动变量(无序):
编译器会删除dead variables
编译器会找到最佳订单来存储每个订单以满足suitable alignment
编译器可能会使用CPU register directly,具体取决于它的Register Allocation算法决定
编译器可能会将某些变量合并到一个vector寄存器中,并使用向量指令,前提是它会产生正确的结果。
......还有更多。
1 :大多数编译器甚至堆栈指针都是aligned。
答案 2 :(得分:0)
注册和优化。
变量的最有效访问是消除它们。许多编译器将优化掉未使用的变量。
如果在本地使用变量,编译器可能会决定将变量放在寄存器中。寄存器是变量的最有效访问。
堆栈是一种方便的数据结构,用于分配局部变量。编译器可以通过更改堆栈指针来销毁堆栈上的变量。使用堆栈的实现通常具有指向堆栈顶部的指针(分配下一个变量的位置)。分配就像通过常量调整指针一样简单(这是一个算术运算)。
请记住,编译器使用堆栈没有要求。
答案 3 :(得分:0)
感谢您的帮助,我现在也对我正在寻找的逻辑描述了一个不太糟糕的描述,对于任何被插入的人,我会在这里发布链接: http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html