Микрооптимизации: использование intptr_t для типов flag / bool

Насколько я понимаю, определение intptr_t зависит от архитектуры - он гарантированно обладает способностью представлять указатель, который может получить доступ ко всему единообразному адресному пространству процесса.

Nginx (популярный веб-сервер с открытым исходным кодом) определяет тип, который используется как флаг (логический), и это typedef для intptr_t. Теперь, используя в качестве примера архитектуру x86-64, которая имеет доступ к множеству инструкций, охватывающих операнды всех размеров, зачем определять флаг как intptr_t? Несомненно, традиция использования 32-битного типа bool также подойдет вам?

Я просмотрел 32-битную версию Vs. Я сам спорил с 8-битными логическими значениями, когда был новым разработчиком, и пришел к выводу, что 32-битные логические значения лучше работают в общем случае из-за сложности конструкции процессора. Зачем тогда вообще нужно переходить на 64-битные bools?


person Hassan Syed    schedule 12.08.2010    source источник


Ответы (2)


Единственные люди, которые действительно знают, почему nginx использует intptr_t для логического типа, - это разработчики nginx.

Как вы говорите, 32-битные логические объекты часто работают лучше, чем 8-битные логические объекты в общем случае. Я сам не проводил бенчмаркинг, но мне кажется вполне разумным, что в определенной ситуации на x86-64 64-битное bool превосходит 32-битное bool. Например, в исходном коде nginx я заметил, что большинство ngnx_flag_t встречается в структурах с другими (u)intptr_t типами. 32-битный логический тип может не сэкономить здесь место из-за выравнивания заполнения.

Я нахожу выбор для intptr_t немного странным, поскольку это дополнительный тип C99 с целью преобразования в / из void *. Но насколько я понимаю, он никогда не использовался как таковой. Возможно, этот тип дает наилучшее приближение для «родного» шрифта размером с слово?

person schot    schedule 21.08.2010

64-битный bool звучит как ужасная идея для x86-64. Я предполагаю, что человек, который это написал, думал в то время о 32-битных машинах с 32-битными указателями.

Современный x86 имеет очень хорошую поддержку невыровненных загрузок / сохранений и распаковки байта для заполнения регистра на лету. Если x86 является основной целью, предпочтительнее 8-битное логическое значение, особенно в тех случаях, когда оно экономит байты, что приводит к меньшему использованию кеша. В редких случаях, когда кеш вообще не является проблемой, 32-битный является естественным размером и, возможно, сохранит инструкцию в некоторых случаях, когда логическое значение добавляется или умножается непосредственно на int, позволяя использовать логическое значение в качестве памяти. операнд вместо загрузки с movzx.

Для обычного случая тестирования и перехода на логическое значение процессоры Intel и AMD имеют буквально нулевую разницу в производительности между 8-битными и 32-битными операндами, будь то в памяти или в регистре.

person Peter Cordes    schedule 27.12.2015