Sizeof округляет до выравнивания, но компилятор все еще помещает объекты в оставшиеся байты - PullRequest
2 голосов
/ 07 июня 2019

Учитывая код и его вывод ниже

#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 округляет размер здесь, если он не соблюдается?

1 Ответ

5 голосов
/ 07 июня 2019

Он размещен something в 140729604143976, что составляет 0x7FFE2A107B68
Он размещен character в 140729604143975, что составляет 0x7FFE2A107B67

Обратите внимание, что character был размещен набайт перед something в памяти и, следовательно, действителен.something работает от 0x7FFE2A107B68 до 0x7FFE2A107B70 и не перекрывается с character.

...