C ++十六进制表示法和按位运算符性能

时间:2015-10-11 12:55:37

标签: c++ optimization bitwise-operators

可能是一个愚蠢的问题,但我经常使用C ++应用程序:

x & 0xff

其中x是32位整数。将前导零也放入是否有任何性能优势,所以它是两个32位数之间的AND运算?

x & 0x000000ff

我读到在评估操作之前,任何小于int的操作数都将被提升为int。我想这是一个优化编译器自动完成的,或者我是否以任何方式帮助MSVC将那些前导零置于那里?

2 个答案:

答案 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,但您可以进行完全相同的测试并检查输出是否不同!