考虑下面的代码及其输出
#include <cstdint>
#include <iostream>
using std::cout;
using std::endl;
class alignas(8) Something {
std::uint8_t integer{};
};
int main() {
auto something = Something{};
auto character = std::uint8_t{};
cout << sizeof(something) << endl;
cout << reinterpret_cast<std::uintptr_t>(&something) << endl;
cout << reinterpret_cast<std::uintptr_t>(&character) << endl;
}
https://wandbox.org/permlink/m6D0PYWyrGlfjYJP。 单次运行的输出
8
140729604143976
140729604143975
如果我有一个对齐到 8 个字节的结构,则在其上调用 sizeof
会将结构的大小舍入到其对齐方式的最接近的倍数。但是编译器仍然能够将对象放置在舍入大小留下的假设空间中。
在什么情况下是允许的?总是允许的吗?如果不尊重大小,为什么sizeof
在这里四舍五入?
它something
放置在140729604143976
,这是0x7FFE2A107B68
它的位置character
140729604143975
,这是0x7FFE2A107B67
请注意,character
已放置在内存中something
之前的字节中,因此有效。 something
从0x7FFE2A107B68
运行到0x7FFE2A107B70
,根本不与character
重叠。