#include <iostream>
using namespace std;
class V3 {
public:
double x, y, z;
V3(double a, double b, double c) {
x=a;
y=b;
z=c;
cout << "Addresses are " << &x << " " << &y << " " << &z << endl;
}
};
int main() {
V3 a(1,1,1), b(2,2,2), c(3,3,3), d(4,4,4);
cout << sizeof(a) << " " << sizeof(b) << " " << sizeof(c) << " " << sizeof(d) << endl;
}
在上面提到的代码中,我试图了解 C++ 如何在内存中存储对象。运行此代码时,我得到以下输出 -
Addresses are 0x7ffc5996b160 0x7ffc5996b168 0x7ffc5996b170
Addresses are 0x7ffc5996b180 0x7ffc5996b188 0x7ffc5996b190
Addresses are 0x7ffc5996b1a0 0x7ffc5996b1a8 0x7ffc5996b1b0
Addresses are 0x7ffc5996b1c0 0x7ffc5996b1c8 0x7ffc5996b1d0
24 24 24 24
所以对于对象 b
,我想知道为什么我没有得到 0x7ffc5996b178
作为我的地址。为什么 C++ 在开始下一个对象之前跳过 8 个字节?
最佳答案
将各种评论转换为社区 Wiki 答案。
作业是否必要?如果你使用
V3(double a, double b, double c) : x(a), y(b), z(c) { cout << …; }
有什么变化吗? ? (我不希望有什么不同。)你试过在main()
中打印类对象的地址吗? ?这对事情有任何启示吗?不过,归根结底,你的问题是徒劳的——编译器可以使用它选择的任何布局和对齐方式,只要它给出正确的结果。只是一个猜测:x86 缓存行是 64 字节。通过这种方式对齐,前 2 个对象将适合 1 个缓存行,而第三个对象将适合第二个缓存行。如果它们不以这种方式对齐,第三个对象将被拆分为 2 个缓存行,这很糟糕。正如已经说过的,它不一定定义明确。
如果使用
clang
编译在 arch 上,当使用g++
时,对象在内存中密集排列他们不是。
关于c++ - 我尝试制作对象时跳过了 8 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40188746/