当我尝试制作对象时,跳过8个字节

8 bytes skipped while I try to make objects?

本文关键字:跳过 8个 字节 对象 作对      更新时间:2023-10-16
#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个字节?

将各种评论转换为Community Wiki答案

  • 分配是否必要?如果你使用V3(double a, double b, double c) : x(a), y(b), z(c) { cout << …; },有什么变化吗?(我不认为会有什么不同。)您是否尝试打印main()中类对象的地址?这能说明什么问题吗?最终,虽然,你的问题是徒劳的-编译器被允许使用任何布局和对齐它选择只要它给出正确的结果。

  • 只是猜测:x86缓存行是64字节。通过这种方式对齐,前两个对象将适合于一条缓存线,第三个对象将适合于第二条缓存线。如果它们不是这样对齐的,那么第三个对象将被分割成2条缓存线,这很糟糕。正如已经说过的,它不一定定义良好。

  • 如果在arch上使用clang编译,对象在内存中是密集的,当使用g++编译时,它们不是。