Когда выровнять 8 байтов не достаточно?
Я пытаюсь реализовать pimpl без кучи (адаптироваться из SO вопрос).
Я думаю, что я должен зарезервировать char[]
я и жесткий код alignment = 8
,
Тем не менее, я очень новичок в C++ выравнивания. Я боюсь, что 8 не достаточно.
Мое обучение
После некоторого прочтения я понимаю, что alignof
максимальный размер внутреннего поля.
Я экспериментировал:
struct A { //size = 16 alignof = 8 (max{4,1,8})
int n; //address = [0,4)
bool flag; //address = [4,5)
double k; //address = [8,16)
};
struct B{ //size = 24 alignof = 8 (max{A,1})
A a; //address = [0,16)
char c; //address = [16,24) 24=16+8(align)
};
Исходя из эксперимента, я думаю, что выравнивание для моего pimpl должно быть = 8 (консервативный).
Это должно быть безопасно, пока максимальный размер примитива равен 8.
Справка: самый большой тип примитивов имеет не менее 8 байтов. (но давайте предположим, что это на самом деле 8 байтов)
Вопрос
Есть ли случаи, когда я должен установить выравнивание> 8?
Другими словами, достаточно ли 8 байтов для всех практических случаев?
Я верю, что ответ "это безопасно", но такой вопрос смутил меня.
Вот часть вопроса:
Функция "memset_16aligned" требует, чтобы ей был передан выровненный указатель размером 16 байт, иначе произойдет сбой.
Я также прочитал: