2016-09-02 4 views
4

Рассмотрим этот код в 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!). Если добавить атрибут, упакованный в Базе, а также, то это хорошо в обоих составителей. Кто-нибудь знает, какой является правильным и почему?

+6

Оба они правы. В целом, вопросы выравнивания и упаковки, определяются по реализации. –

+1

Я не удивлюсь, если это также изменится для разных версий Clang и/или разных сред сборки. –

ответ

2

Оба правы.

Компилятору разрешено добавлять дополнение к вашему классу (между членами и в конце), и определяется ли реализация, делает он это или нет, поэтому ваши static_assert в основном тестируют что-то, что зависит от используемого компилятора (и платформы) таким образом, они не переносятся, и вы не можете ожидать того же результата во всем мире.

Ваше использование __attribute__((packed)) в основном сообщает компилятору (-ам), кто понимает атрибут, который вы хотите указать c, а не то, что он будет делать по умолчанию. Это может привести к тому, что вы захотите в этом случае, но это также имеет последствия (расположение/использование памяти и производительность некоторых процессоров). И вы все еще не можете быть уверены, что все компиляторы сделают то же самое.

1

Это концепция реализации, которая отличается от реализаций и компилятора.

Как сказано, компилятору разрешено добавлять дополнительное пространство в класс, а код, подобный тому, что вы написали, не переносится. Объем пространства или добавление дополнений отличается от компилятора, и ни один код не может иметь надежную проверку, которая удовлетворит все. Это приведет к разным результатам в разных местах, потому что все компиляторы разные.

Смежные вопросы