2017-02-03 9 views
2

Предоставлено (возможно, не-POD) struct с одним членом, ни наследства, и нет виртуальных методов:Выравнивание и размер гарантии для отдельных структур членов

struct Foo { 
    Bar value; 

    Foo() { /* do something */ } 
}; 

делает C++ гарантирует, что Foo будет иметь тот же выравнивание и sizeof как Bar? Если нет, то какие гарантии могут быть даны? Могут ли быть некоторые гарантии, если я исправлю Bar как особый тип типа (POD, базовый тип, ...)?

+0

IIRC есть хотя бы один компилятор, который округлял все размеры класса до кратного 4, поэтому класс с одним членом 'char' имел бы 3 байта заполнения. – MSalters

ответ

2

Данных гарантий нет. В частности, компилятор может проложить прочь мимо конца value. Они не должны иметь одинаковые требования к выравниванию.

Вы можете гарантировать, что

  1. Адрес первого элемента value такой же, как адрес структуры.

  2. sizeof(Foo) - не менее sizeof(Bar) (иначе арифметика указателя сломается ужасно).