long t;
bool b;
int i;
signed char c;
...
Вы получаете предупреждение, когда делаете что-либо, что было бы «свободным», если bool не требовалось быть 0 или 1. b = !! t эффективно присваивает результат (встроенный язык, не переопределяемый ) bool operator!(long)
Вы не должны ожидать! или! = операторы, которые обходятся без инструкций asm даже с оптимизирующим компилятором. Обычно верно, что int i = t обычно полностью оптимизируется. Или даже со знаком char c = t; (в x86 / amd64, если t находится в регистре% eax, после c = t использование c означает просто использование% al. amd64 имеет байтовую адресацию для каждого регистра, BTW. IIRC, в x86 некоторые регистры не имеют байтовой адресации .)
В любом случае, b = t; i = b<code>; isn't the same as <code>c = t; i = c;
это i = !! t; вместо i = t & 0xff ;
Err, я думаю, что все уже знают все это из предыдущих ответов. С моей точки зрения, предупреждение имело смысл для меня, так как оно обнаруживало случаи, когда компилятору приходилось делать то, о чем вы на самом деле не говорили, например !! BOOL при возврате, потому что вы объявили функцию bool, но возвращаете целое значение это может быть правдой и! = 1. например много вещей из окон возвращает BOOL (int).
Это одно из немногих предупреждений MSVC, которого нет в G ++. Я гораздо больше привык к g ++, и он определенно предупреждает о вещах, которых нет в MSVC, но я рад, что рассказал мне об этом. Я написал заголовочный файл portab.h с заглушками для используемых MFC / Win32 классов / макросов / функций. Получилось приложение MFC, над которым я работаю для компиляции на моем компьютере с GNU / Linux дома (и с cygwin). В основном я хотел иметь возможность компилировать-тестировать то, над чем я работал дома, но в итоге я нашел предупреждения g ++ очень полезными. Это также намного строже, например. шаблоны ...
В целом по bool я не уверен, что это улучшает код при использовании в качестве возвращаемых значений и передачи параметров. Даже для местных жителей g ++ 4.3, похоже, не понимает, что ему не нужно приводить значение к 0 или 1, прежде чем переходить на него. Если это локальная переменная, и вы никогда не берете ее адрес, компилятор должен сохранять ее в любом размере, который является самым быстрым. Если он должен пролить его из регистров в стек, он также может хранить его в 4 байтах, поскольку это может быть немного быстрее. (Он использует много инструкций movsx (расширение-знак) при загрузке / хранении (нелокальных) bools, но я действительно не помню, что он делал для автоматических (локальных стеков) переменных. Я помню, что это оставляло странным количество стекового пространства (не кратное 4) в функциях, которые имеют некоторые локальные переменные bools.)
Использование флагов bool было медленнее, чем int с компилятором Digital Mars D по состоянию на прошлый год:
http://www.digitalmars.com/d/archives/digitalmars/D/opEquals_needs_to_return_bool_71813.html
(D очень похож на C ++, но отказывается от полного обратного компиляции C, чтобы определить некоторую приятную новую семантику и хорошую поддержку метапрограммирования шаблонов. Например, «static if» или «static assert» вместо шаблонных хаков или макросов cpp. хотел бы попробовать D когда-нибудь.:)
Для структур данных это может иметь смысл, например, если вы хотите упаковать пару флагов перед int, а затем несколько удваивается в структуре, у вас будет довольно много.