Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中



考虑下面的代码及其输出

#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之前的字节中,因此有效。 something0x7FFE2A107B68运行到0x7FFE2A107B70,根本不与character重叠。

最新更新