c++ static_cast何时编译为非CPU指令

zqdjd7g9  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(196)

这个问题是由以下(简化)示例激发的。

Consider the following code:

void f(unsigned int x) { }

int main()
{
  int z = 3;
  
  if (z > 0)
    for (unsigned int i = 0; i < z; ++i)
      f(i);

  return 0;
}

在启用所有警告的情况下编译时,编译器将发出

warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’

这显然不是一个真实的的问题,因为代码显式地检查for循环中的上限是否为正。
消除该警告的一种方法是显式static_cast z:

int main()
{
  int z = 3;
  
  if (z > 0)
    for (unsigned int i = 0; i < static_cast<unsigned int>(z); ++i)
      f(i);

  return 0;
}

至少在这个简化的例子中,两个代码编译成相同的汇编程序,在godbolt上可以看到。实际上,我不希望从int到unsigned int的转换会导致任何指令,因为两种类型都是stored with the same number of bits
这就引出了一个问题:static_cast什么时候会导致没有编译指令?static_cast在具有相同位数的整数之间是否总是这样?

kb5ga3dv

kb5ga3dv1#

当你没有强制转换时,编译器会为你添加一个转换,所以它们都编译成相同的机器码是有意义的,但是当它是隐式的时,很可能你没有预料到甚至没有意识到(只要在StackOverflow上搜索一下人们试图比较vector.size()-1的案例数量)。所以你的编译器会生成一个警告,要求你确认这是你真正想要的。

相关问题