我写了一个非常简单的例子,演示了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
?