可能是一个愚蠢的问题,但我经常使用C ++应用程序:
x & 0xff
其中x是32位整数。将前导零也放入是否有任何性能优势,所以它是两个32位数之间的AND运算?
x & 0x000000ff
我读到在评估操作之前,任何小于int的操作数都将被提升为int。我想这是一个优化编译器自动完成的,或者我是否以任何方式帮助MSVC将那些前导零置于那里?
答案 0 :(得分:6)
将这些零添加到源代码中绝对没有区别。在编译器完成解析代码之前,它们已在lexing阶段被删除。它们不会影响代码生成。
答案 1 :(得分:1)
编写此代码:
#include <iostream>
int main()
{
int x = 400;
#ifdef SHORT
std::cout << (x & 0xFF) << std::endl;
#else
std::cout << (x & 0x000000FF) << std::endl;
#endif
return 0;
}
使用和不使用-DSHORT进行编译:
g++ -std=c++11 -DSHORT main.cpp -o test_short
g++ -std=c++11 main.cpp -o test_long
对生成的可执行文件进行差异,它们完全相同(使用和不使用-O3选项进行测试)。
因此g ++编译器正确处理了这一点,在编写代码时你不需要处理它(添加零对生成的代码没有任何影响)。我没有MSVC,但您可以进行完全相同的测试并检查输出是否不同!