如果在编译时知道边缘条件,我怎么能省略一个调用呢?

sha*_*oth 8 c++ optimization compiler-optimization visual-c++

我有以下情况:有一大堆模板std::vector会调用memmove()移动数组的部分.有时他们会想要"移动"长度为零的部分 - 例如,如果删除了数组尾部(例如std::vector::erase()),他们将希望移动数组的其余部分,这些部分的长度为零,并且零将在编译时(我看到反汇编 - 编译器知道)但编译器仍会发出memmove()调用.

所以基本上我可以有一个包装器:

inline void callMemmove( void* dest, const void* source, size_t count )
{
   if( count > 0 ) {
       memmove( dest, source, count );
   }
}
Run Code Online (Sandbox Code Playgroud)

但这会引入一个额外的运行时检查,count在编译时不知道我不想要的情况.

是否有可能使用__assume提示向编译器指示如果它确定count为零则应该消除memmove()

lit*_*adv 3

的要点__assume是告诉编译器在优化时跳过部分代码。在您提供的链接中,示例是通过构造default的子句给出的switch- 提示告诉编译器该子句永远不会达到,即使理论上可以达到。基本上,您是在告诉优化器,“嘿,我知道得更好,扔掉这段代码”。

因为default你不能不写它(除非你覆盖了cases 中的整个范围,这有时是有问题的),因为它会导致编译错误。因此,您需要提示来优化知道不需要的代码。

在您的情况下 -可以访问代码,但并非总是如此,因此__assume提示对您没有多大帮助。你必须检查它是否count真的是0。除非你确定它永远不会是0以外的任何东西,否则就不要写入它。