Когда выровнять 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 байт, иначе произойдет сбой.

Я также прочитал:

0 ответов

Другие вопросы по тегам