Почему loki::flex_string's SmallStringOpt нуждается в aligment
Я читаю исходный код flex_string и не очень хорошо понимаю, почему выравнивание необходимо, просто из соображений производительности?
union
{
mutable value_type buf_[maxSmallString + 1];
Align align_;
};
вот ссылка на проектный документ flex_string:
http://www.drdobbs.com/generic-a-policy-based-basicstring-imple/184403784
Автор сказал: Но что это за бизнес Align? Ну, когда вы имеете дело с таким "распределением мест", вы должны быть осторожны с вопросами выравнивания.
1 ответ
Цитата из связанной статьи:
Но что это за бизнес Align? Ну, когда вы имеете дело с таким "распределением мест", вы должны быть осторожны с вопросами выравнивания. Поскольку не существует переносимого способа выяснить, какие требования к выравниванию имеет Storage, SmallStringOpt принимает тип, который определяет выравнивание, и сохраняет его в фиктивной переменной align_.
Я считаю, что это связано с параметром хранилища шаблона. Чтобы быть как можно более универсальным, класс пытается работать с любым контейнером, даже если у этого контейнера есть определенные требования по выравниванию для его элементов. Это может быть связано с производительностью или совместимостью с определенной архитектурой. Дело в том, что не существует надежного, портативного способа выяснить требования к выравниванию того, чем в конечном итоге является "Хранение".
Следовательно, параметр Align предназначен для некоторого типа, размер которого равен выравниванию, требуемому для Storage. Это фиктивная переменная в объединении - она никогда не записывается и не читается. используется только его размер.
Из кода видно, что маленький размер строки является наибольшим из сконфигурированного максимума, а выравнивание делает выравнивание минимальным конфигурируемым небольшим размером строки.
Надеюсь это поможет!