#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个字节?
答案 0 :(得分:1)
将各种评论转换为社区Wiki答案。
分配是否必要?如果您使用V3(double a, double b, double c) : x(a), y(b), z(c) { cout << …; }
,有什么变化吗? (我不希望存在差异。)您是否尝试在main()
中打印类对象的地址?这会对事物有所了解吗?但最终,你的问题是徒劳的 - 只要它给出了正确的结果,编译器就可以使用它选择的任何布局和对齐。
猜测:x86缓存行是64字节。通过这种方式对齐,前两个对象将适合1个缓存行,第三个适合第二个缓存行。如果它们没有以这种方式对齐,则第三个对象将被分割为两个缓存行,这是不好的。如前所述,它不一定定义明确。
如果在arch上使用clang
进行编译,则对象会在内存中密集打包,使用g++
时,它们不会。