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(信息放在数据类型之后(或之前(。 例如,当为数组动态分配内存时,编译器可以选择将分配的大小放在数组附近(对于恢复内存很有用(。
寄存 器
编译器可以将变量放在寄存器中。 因此,变量将具有不同的地址,因为寄存器通常不在同一内存映射中;尽管有些处理器具有内存映射寄存器。
解析
变量可以分配到便于解析的位置。 编译器可能会延迟变量分配,直到方便,或者在优化传递期间更改位置。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- C++堆栈中数组之间的间隙
- 是否保证 std::vector 不会在元素之间留下间隙