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

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

最佳答案

将各种评论转换为社区 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/

相关文章:

c++ - 检查是否存在全局(/命名空间)函数/对象声明

c++ - 如何更新到 mingw-gcc 4.8.2?

c++ - CMake:将可执行文件链接到多个库 (*.so)

c++ - 如何使某些代码仅在调试构建目标中运行?

c++ - 在 Qt5 代码中禁用旧的(Qt4 风格的)Signal-Slot 语法

C++ 数组、函数和计数器

c++ - 避免使用模板函数的 if-else 语句

c++ - 关于wxWidgets继承的问题

c++ - C++一次播放多个WAVE资源文件

c++ - 将 QKeySequence/QKeySequenceEdit 限制为只有一个快捷方式