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

C++ Hexadecimal notation and bitwise operators performance

可能是个愚蠢的问题,但我有一个 C++ 应用程序,我经常在其中做:

x & 0xff

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

x & 0x000000ff

我读到任何小于 int 的操作数都将在计算操作之前提升为 int。我想这是编译器自动执行的优化,还是我通过将前导零放在那里以任何方式帮助 MSVC?

将这些零添加到您的源代码中绝对没有任何区别。它们在词法分析阶段被删除,甚至在编译器完成代码解析之前。它们不会影响代码生成。

写这段代码:

#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,但你可以做完全相同的测试并检查输出是否不同!