为什么移动返回到函数末尾的效率较低
Why is moving return to the end of the function less efficient?
编辑:删除UB(好点,我错过了)后,时间或多或少相同。将标记一个主持人以将其删除。
这两个函数是相同的,除了foo
在两个分支上的if
内部都有返回,而goo
在末尾只有一个return
:
int foo()
{
static int x = 0;
if ( x )
{
x > 2 ? x = 0 : ++x;
return x-1;
}
else
{
x++;
return x-1;
}
}
int goo()
{
static int x = 0;
if ( x )
{
x > 2 ? x = 0 : ++x;
}
else
{
x++;
}
return x-1;
}
数字就在那里,这样优化就不会太难,函数调用也不会被优化掉。在MSVS 2010上使用完全优化编译。
调用函数400000000次,采样10次,foo
总是更快:
foo
-8830 ms平均值goo
-8703 ms平均值
差别很小,但确实存在。为什么?此外,为什么编译器不将它们优化为相同的东西?
看看汇编程序的输出,在goo()的第一个分支中可能会跳转到函数的末尾。
我假设这是因为在每个if
中都有返回,在操作完成的那一刻,foo
将返回计算出的变量。
goo
,即使认为它做了相同的事情,除了两个返回,仍然必须检查else
语句。这需要一些时间(非常小),但正如你所看到的,这是无法估量的。
在foo的情况下,将不会执行"if"answers"else"的大括号。返回后
语句控件将直接得到函数的右括号。
这就是为什么foo需要更少的时间。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 将QGraphicsItem的移动区域限制在多边形区域内
- 复制和移动构造函数之间的效率差异
- 为什么同时使用一个赋值运算符处理复制和移动赋值效率不高
- 为什么移动返回到函数末尾的效率较低
- 野牛价值移动/效率
- 首先创建字符串,然后通过移动语义将其添加到 vector 或在 vector 中创建元素是否具有内存效率