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。
我猜你想谈论 struct
s 和 class
es 变量的内存布局和地址顺序是 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
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。
我猜你想谈论 struct
s 和 class
es 变量的内存布局和地址顺序是 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