Почему 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. Это фиктивная переменная в объединении - она ​​никогда не записывается и не читается. используется только его размер.

Из кода видно, что маленький размер строки является наибольшим из сконфигурированного максимума, а выравнивание делает выравнивание минимальным конфигурируемым небольшим размером строки.

Надеюсь это поможет!

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