C++堆栈中数组之间的间隙

C++ gap between arrays in stack

本文关键字:间隙 之间 数组 堆栈 C++      更新时间:2023-10-16

此代码的输出:

int a;
int b;
cout<<"a: "<<&a<<endl;
cout<<"b: "<<&b<<endl;

是:

a: 0x6ffe4c
b: 0x6ffe48

这是有道理的,它们之间的差异应该是 4 个字节,但这段代码的输出:

int A[1];
int B[1];
cout<<"A: "<<A<<endl;
cout<<"B: "<<B<<endl;

是:

A: 0x6ffe40
B: 0x6ffe30

所以现在的差异是 16 个字节,谁能解释为什么? 为什么需要这个差距?我不知道当你分配这样的数组时堆栈中存在间隙,并认为在这种情况下 B[1] 与 A[0] 相同。

C 和 C++ 都不保证内存中自动变量的顺序,或它们之间的任何填充。这些是特定编译器的实现详细信息。

为了解释实例中数组变量之间的差距,您需要研究 GNU C++编译器如何为变量分配内存。 变量的分配取决于编译器。

变量之间差距的一些原因(不包括(:

对准

当处理器可以从与其字大小对齐的地址中获取时,效率更高。 例如,具有 32 位字的处理器喜欢从 4 字节对齐的地址中获取。 从地址 5 访问 32 位需要两次读取,然后进行一些字节移动以将字节按正确的顺序放置。

数据细分受众群

常量变量可以放置在可执行文件或只读数据段中。 它可以在读/写变量旁边声明,因此它们之间有一个间隙日志。

超限空间

编译器可以在数组之后分配空间,以便在数组溢出时提供"缓冲"。

元信息

编译器可以选择将有关数据类型的属性(Meta(信息放在数据类型之后(或之前(。 例如,当为数组动态分配内存时,编译器可以选择将分配的大小放在数组附近(对于恢复内存很有用(。

寄存 器

编译器可以将变量放在寄存器中。 因此,变量将具有不同的地址,因为寄存器通常不在同一内存映射中;尽管有些处理器具有内存映射寄存器。

解析

变量可以分配到便于解析的位置。 编译器可能会延迟变量分配,直到方便,或者在优化传递期间更改位置。