繁体   English   中英

堆栈中数组之间的C ++差距

[英]C++ gap between arrays in stack

此代码的输出:

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)信息放置在数据类型之后(或之前)。 例如,当为数组动态分配内存时,编译器可能会选择将分配的大小放在数组附近(用于恢复内存)。

寄存器

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

解析中

可以在便于解析的位置分配变量。 编译器可能会延迟变量分配,直到方便或在优化过程中更改位置为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM