При чтении this Я был поражен тем, что определенный уровень метапрограммирования может сделать для вашего класса. Я должен признать, что я не в полной мере понять, что предлагаемое оптимальное расположение, если бы я должен был заявить, что я понял, что это будет так:У реализации кортежа есть оптимизированная компоновка?
член класса упорядочение по убыванию выравнивания т.е. типа с наибольшей
alignof
результат идет первый и т.д.
вы можете исправить меня, если я получил это неправильно (если у вас есть краткое объяснение того, почему это происходит, было бы еще лучше, я не мог копировать вставить большие куски обоснование в моем вопросе) , но мой вопрос касается другой темы:
Есть ли такая реализация библиотеки в std::tuple
?
Если нет, существуют ли какие-либо стандартные типы алгебраических данных, есть ли другой способ сделать это для моего класса, помимо написания такого механизма?
Не могли бы вы рассказать о том, почему упорядочение по нисходящей настройке было бы оптимальным вариантом? –
@LorahAttkins: Это эвристика, которая часто работает. Он предполагает, что сам класс обычно максимально выровнен, поэтому поэтому ваши максимально согласованные члены сначала не гарантируют отсутствие байтов заполнения между вашими максимально выровненными членами. Затем переходите к следующим самым большим членам выравнивания и придерживайтесь той же логики. Когда у вас заканчиваются члены, у вас обычно будет добавление дополнительных слов, чтобы округлить sizeof (your_class) до кратного выравнивания класса. Поэтому иногда трюк order-by-align сэкономит вам байты, а иногда и не будет. Это хороший инструмент для работы с инструментами. –
Я должен был добавить к моему комментарию выше: размер каждого типа кратен выравниванию для этого типа. Например, нет такой вещи, как тип с выравниванием по 16 байт и sizeof 15 или 17. Его sizeof будет 16 или 32 или 48 и т. Д. Это означает, что и '& a' *, и' 'и a + 1', являются указателями с выравниванием как наименее значимыми, как 'alignof (a)'. –