代码之家  ›  专栏  ›  技术社区  ›  user2138149

为什么这个3字节的结构体的`alignof`值为1?[副本]

  •  0
  • user2138149  · 技术社区  · 9 月前

    我写了一个非常简单的例子,演示了3字节的地址对齐 struct .

    #include <iostream>
    
    struct Silly {
        char a;
        char b;
        char c;
    };
    
    int main() {
    
        std::cout << "sizeof(Silly): " << sizeof(Silly) << std::endl;
        std::cout << "alignof(Silly): " << alignof(Silly) << std::endl;
        auto p_silly = new Silly[2];
        std::cout << "address[0]: " << &p_silly[0] << std::endl;
        std::cout << "address[1]: " << &p_silly[1] << std::endl;
        std::cout << "stride: " << &p_silly[1] - &p_silly[0] << std::endl;
        delete[] p_silly;
    }
    

    用以下方式编译 g++ -std=c++23 ,我发现了以下结果:

    sizeof(Silly): 3
    alignof(Silly): 1
    address[0]: 0x63b1ada176c0
    address[1]: 0x63b1ada176c3
    stride: 1
    

    这个输出对我来说没有任何意义。

    sizeof() = 3 这是合理的,因为该结构体包含3个字节的数据。没有填充,因为每个字段都是 char ,处理器可以从任何地址加载和存储单个字节。

    alignof() = 1 对我来说没有任何意义。对齐是指可以分配对象的连续地址之间的字节数。我希望看到 3 在这里?

    这两个地址表明 struct Silly 它们被分配在一起,没有填充。第二个对象的地址比第一个对象长3个字节。这是有道理的。

    stride 起初我很困惑,但我意识到这是两个地址之间的元素数量。最初我认为应该是两个地址之间的字节数。

    为什么是 alignof 等于 1 ?

    1 回复  |  直到 9 月前
        1
  •  4
  •   user2357112    9 月前

    对齐并不是你想象的那样。它不是一个类型的两个对象可以对齐的位置之间的字节数 共存 。它是一个类型的对象在有效地址之间的字节数 能够 被分配。

    试着把两个例子放在一起并不重要 Silly 连续对齐的地址会重叠。