我尝试制作对象时跳过了8个字节?

时间:2016-10-22 05:42:32

标签: c++

#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个字节?

1 个答案:

答案 0 :(得分:1)

将各种评论转换为社区Wiki答案。

  • 分配是否必要?如果您使用V3(double a, double b, double c) : x(a), y(b), z(c) { cout << …; },有什么变化吗? (我不希望存在差异。)您是否尝试在main()中打印类对象的地址?这会对事物有所了解吗?但最终,你的问题是徒劳的 - 只要它给出了正确的结果,编译器就可以使用它选择的任何布局和对齐。

  • 猜测:x86缓存行是64字节。通过这种方式对齐,前两个对象将适合1个缓存行,第三个适合第二个缓存行。如果它们没有以这种方式对齐,则第三个对象将被分割为两个缓存行,这是不好的。如前所述,它不一定定义明确。

  • 如果在arch上使用clang进行编译,则对象会在内存中密集打包,使用g++时,它们不会。