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