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

Cur*_*ous 2 c++ struct memory-alignment c++17

考虑下面的代码及其输出

#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;
}
Run Code Online (Sandbox Code Playgroud)

https://wandbox.org/permlink/m6D0PYWyrGlfjYJP。一次运行的输出

8
140729604143976
140729604143975
Run Code Online (Sandbox Code Playgroud)

如果我有一个对齐到8个字节的结构,则对其进行调用sizeof会将结构的大小四舍五入到其对齐的最接近倍数。但是编译器仍然能够将对象放置在向上取整后剩下的假设空间中。

在什么情况下允许?总是允许吗?sizeof如果不尊重尺寸,为什么要在此处四舍五入?

Mik*_*ine 5

它的位置something140729604143976哪里0x7FFE2A107B68
它的位置character140729604143975哪里0x7FFE2A107B67

请注意,character它已放在内存中的 一个字节处,something因此有效。something从运行0x7FFE2A107B680x7FFE2A107B70完全不重叠character