可以通过消除> =比较的需要,对无符号整数进行类型惩罚,使得边界检查更快吗?

Stu*_*ude 12 c++ int performance type-punning integer-arithmetic

假设我的程序中有一个非常性能关键的循环,我需要检查一个点是否在矩形内,但我知道在编译时下限始终为0,如下所示: (x >= 0 && y >= 0 && x < width && y < height)

我可以消除前两个比较的类型双关x和y的无符号整数(例如喜欢的东西reinterpret_cast<>()union用C++),因为符号位将保证任何负数会变成一个unsigned int足够大的失败边界检查?如果是这样,您将如何用C++或其他语言实现它?这样做可以获得任何性能提升吗?

Ros*_*ith 12

是的,当您测试有符号整数并且下限为零时,它是完全有效的优化.实际上,这是一种常见的优化,您的编译器几乎肯定会自动执行此操作; 通过自己动手来模糊代码很可能是一个毫无意义的过早优化.

我刚刚在GCC 4.9上对此进行了测试,并通过检查生成的汇编代码确认它自动执行此优化-O1.我希望所有现代编译器也能这样做.

  • 没错,编译器非常聪明,可以发现这个优化机会并为您完成. (3认同)
  • @Stuntddude这是一个全新的问题.对于其他人. (2认同)
  • 如果编译器可以证明`width`是非负的,那么这种优化是否只能自动实现? (2认同)