Микрооптимизация: использование intptr_t для типов флага / bool - PullRequest
4 голосов
/ 12 августа 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

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

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

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

1 голос
/ 28 декабря 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...