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,但你可以做完全相同的测试并检查输出是否不同!
可能是个愚蠢的问题,但我有一个 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,但你可以做完全相同的测试并检查输出是否不同!