Глядя на реализация stc :: basic_string в libc ++, Я столкнулся с этим в строке 1374 (на момент написания):
enum {__alignment = 16};
Это значение используется в последующих вычислениях выравнивания, при этом запросы на размер строки округляются до кратных этому числу.
Я могу принять это немного происходит округление, чтобы избежать фрагментации памяти или чего-то еще, но …
Интересно, есть ли какое-либо конкретное обоснование использования жестко закодированного 16 как число здесь, или если он просто используется как «хороший» круглый номер ».
Для 64-битной машины 16
составляет alignof( std::max_align_t )
и это имеет какой-то смысл. Но точно такое же значение для __alignment
также используется для 32-битных архитектур, так что …?
Когда я впервые разработал <string>
libc ++ еще не суждено было стать открытым исходным кодом. Я писал только для платформ Apple. И Apple malloc
всегда выделяет по крайней мере 16 байтов и кратно 16 байтам, независимо от того, сколько вы запрашиваете (по крайней мере, это было верно в 2007 году, я недавно не проверял).
Так что, если наиболее часто используемый распределитель собирается передать вам 16 байтов, вы можете также использовать их в своем качестве.
Одно время, несколькими годами ранее, я пытался изменить API распределителя так, чтобы он мог спрашивать распределитель, сколько памяти он фактически раздал для любого конкретного запроса. Но эта попытка не удалась. Поэтому следующей лучшей вещью было использование априорных знаний о наиболее распространенном распределителе, с которым собирался иметь дело код.
Других решений пока нет …