Я читаю Agner Fog " Оптимизация программного обеспечения на С++" (для процессоров x86 для Intel, AMD и VIA), и он указывает на страница 34
Булевы переменные сохраняются как 8-битные целые числа со значением 0 для false и 1 для true. Булевы переменные переопределены в том смысле, что все операторы, имеющие Boolean переменные в качестве входной проверки, если входы имеют любое другое значение, чем 0 или 1, но операторы, которые имеют Booleans, поскольку на выходе не может быть другого значения, кроме 0 или 1. Это делает операции с булевыми переменными, поскольку вход менее эффективен, чем необходимо.
Это все еще верно и для компиляторов? Можете ли вы привести пример? Автор утверждает, что
Булевы операции могут быть сделаны намного эффективнее, если с уверенностью известно, что операнды не имеют других значений, чем 0 и 1. Причина почему компилятор не делает такого предположения, что переменные могут иметь другие если они неинициализированы или получены из неизвестных источников.
Означает ли это, что если я, например, беру указатель на функцию bool(*)()
и вызываю его, то операции с ним производят неэффективный код? Или это случай, когда я получаю доступ к логическому виду путем разыменования указателя или чтения из ссылки, а затем работает на нем?