Рассмотрим этот код в C++наследование и атрибут упакованы
struct Base
{
std::int64_t x;
std::int64_t y;
};
static_assert(sizeof(Base) == 16, "Base not of size 16!");
struct Derived : Base
{
std::int32_t z;
}__attribute__((packed));
static_assert(sizeof(Derived) == 20, "Derived not of size 20!");
лязг считает этот код действителен, где, как ССАГПЗ приводит к увольнению второй static_assert. ("Производный не размер 20!). Если добавить атрибут, упакованный в Базе, а также, то это хорошо в обоих составителей. Кто-нибудь знает, какой является правильным и почему?
Оба они правы. В целом, вопросы выравнивания и упаковки, определяются по реализации. –
Я не удивлюсь, если это также изменится для разных версий Clang и/или разных сред сборки. –