![](/img/trans.png)
[英]Using arrays or std::vectors in C++, what's the performance gap?
[英]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.