C++;十六进制表示法和位运算符性能 可能是个愚蠢的问题,但我有一个C++应用程序,我经常这样做: x & 0xff

C++;十六进制表示法和位运算符性能 可能是个愚蠢的问题,但我有一个C++应用程序,我经常这样做: x & 0xff,c++,optimization,bitwise-operators,C++,Optimization,Bitwise Operators,其中x是32位整数。在两个32位数字之间加上前导零是否有任何性能优势,因此它是一个AND操作 x & 0x000000ff 我读到任何小于int的操作数都将在计算操作之前提升为int。我想这是编译器自动进行的优化,或者我是否通过将前导零放在那里来帮助MSVC?将这些零添加到源代码中完全没有区别。它们在词法分析阶段被删除,甚至在编译器完成代码解析之前。它们不会影响代码生成。编写以下代码: #include <iostream> int main() { int x

其中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;
}
生成的可执行文件不同,它们完全相同(使用和不使用-O3选项进行测试)


因此,g++编译器可以正确地处理这一点,在编写代码时不需要考虑这一点(添加零对生成的代码绝对没有影响)。我没有MSVC,但你可以做完全相同的测试,检查输出是否不同

我敢肯定任何编译器都会对此进行优化,但您可以随时检查生成的汇编代码,亲自查看。即使编译器向寄存器中移动一个字节,CPU也会进行零扩展。编译器不应该费心保留前导零。
0x000000ff
0xff
都是
int
文本,因此类型和性能没有差异`0x000000ff可能会影响编译器性能几纳秒或类似的时间。注意:OP没有使用
g++
@owacoder:True,我错过了:他可以对任何编译器重复相同的测试…;-)这就像检查
73*137
今天是否仍然像昨天一样等于10001——这里的任何疑问都是相反的-productive@anatolyg:我不理解你的意见。具有相同的可检查性肯定意味着在代码中添加零是毫无意义的…不是吗?
g++ -std=c++11 -DSHORT main.cpp -o test_short

g++ -std=c++11 main.cpp -o test_long