Какова причина 16-байтового шаблона выравнивания в libc ++ для std :: basic_string? - PullRequest
0 голосов
/ 21 мая 2018

Рассматривая реализацию stc :: basic_string в libc ++, я натолкнулся на это в строке 1374 (на момент написания):

enum {__alignment = 16};

Это значение используется впоследующие вычисления выравнивания, запросы на размер строки округляются до кратных этому числу.

Я могу согласиться с тем, что некоторое округление происходит во избежание фрагментации памяти или чего-то еще, но ...

Интересно, есть ли какое-либо конкретное обоснование для использования в качестве числа здесь жестко закодированного 16 , или оно просто используется как «хорошее» круглое «число».

Для 64-битной машины 16 равняется alignof( std::max_align_t ), и это имеет некоторый смысл.Но точно такое же значение для __alignment используется и для 32-битных архитектур, так что ...?

1 Ответ

0 голосов
/ 24 мая 2018

Когда я впервые разработал <string>, libc ++ еще не было предназначено для открытого кода.Я писал только для платформ Apple.И malloc от Apple всегда выделяет по крайней мере 16 байт и кратно 16 байтам, независимо от того, сколько вы запрашиваете (по крайней мере, это было верно в 2007 году, я недавно не проверял).

Такесли наиболее часто используемый распределитель собирается передать вам 16 байтов, вы также можете использовать их в своем качестве.

Однажды, несколькими годами ранее, я попытался изменить API распределителя так,чтобы он мог спросить распределителя, сколько памяти он фактически раздал для любого конкретного запроса .Но эта попытка не удалась.Поэтому следующей лучшей вещью было использование априорных знаний о наиболее распространенном распределителе, с которым собирался иметь дело код.

...