有些人不知道在C中可以通过值传递和返回结构。我的问题是编译器在C中返回结构时会进行不必要的复制。C编译器(如GCC)是否使用返回值优化(RVO)优化,或者这只是C中的一个概念?我读过的所有关于RVO和复制省略的东西都是关于C的。
让我们考虑一个例子。我目前正在用C实现一个double-double数据类型(或者更确切地说是float-float开始,因为我发现它很容易进行单元测试)。考虑下面的代码。
typedef struct {
float hi;
float lo;
} doublefloat;
doublefloat quick_two_sum(float a, float b) {
float s = a + b;
float e = b - (s - a);
return (doublefloat){s, e};
}
编译器是否会为我返回的双浮位
值创建临时副本,还是可以省略临时副本?
C中的命名返回值优化(NRVO)怎么样?我还有另一个功能
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s;
}
在本例中,我返回一个命名结构。在这种情况下,是否可以删除临时副本?
应该指出的是,这是C语言的一个一般性问题,我在这里使用的代码示例只是示例(当我优化它时,我将使用SIMD和intrinsic)。我知道我可以查看汇编输出,看看编译器做了什么,但我认为这是一个有趣的问题。
它在C中被涵盖很多的原因是因为在C中,RVO有副作用(即不调用临时对象的析构函数,也不调用结果对象的复制构造函数或赋值操作符)。
在C语言中,没有可能的副作用,只有潜在的性能改进。我看不出为什么某些编译器不能执行这样的优化。至少,在标准中没有任何东西禁止它。
无论如何,优化取决于编译器和优化级别,因此我不会对关键代码路径下赌注,除非所使用的编译器定义良好,并且不会发生变化(通常情况下仍然如此)。
C中的“仿佛”规则明确允许RVO/NRVO。
在C语言中,你可以得到可观察到的副作用,因为你重载了构造函数、析构函数和/或赋值运算符来产生这些副作用(例如,当其中一个操作发生时打印出一些东西),但在C语言里,你没有任何能力重载这些运算符,而且内置的运算符没有可观察的副作用。
如果不重载它们,复制省略不会产生任何明显的副作用,因此没有什么可以阻止编译器这么做。
本文向大家介绍C++ 返回值省略,包括了C++ 返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回prvalue表达式,并且prvalue表达式的类型与函数的返回类型相同,则可以忽略prvalue临时对象的副本: 在这种情况下,几乎所有编译器都将忽略临时构造。
本文向大家介绍Objective-C语言返回值,包括了Objective-C语言返回值的使用技巧和注意事项,需要的朋友参考一下 示例 当要从方法返回值时,请将要返回的类型放在第一组括号中。 您要返回的值放在return关键字之后;
什么是拷贝删减?什么是(命名的)返回值优化?它们暗示了什么? 在什么情况下它们会发生?限制是什么? 如果您被引用到此问题,您可能正在查找介绍。 有关技术概述,请参阅标准参考。 请参阅此处的常见情况。
函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句的一般形式为: 或者: 有没有 都是正确的,为了简明,一般也不写 。例如: 对C语言返回值的说明: 1) 没有返回值的函数为空类型,用 表示。例如: 一旦函数的返回值类型被定义为 void,就不能再接收它的值了。例如,下面的语句是错误的: 为了使程序有良好的可读性并减少出错,
本文向大家介绍c++命名的返回值省略,包括了c++命名的返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回左值表达式,则此左值: 表示该函数局部的自动变量,将在 return 自动变量不是函数参数 并且变量的类型与函数的返回类型相同 如果所有这些都成立,那么可以取消从左值的复制/移动: 更复杂的情况适合进行省略,但情况越复杂,编译器实际淘汰它的可能性就越小: 编译器仍然可以忽
我正在用C语言制作一个简单的国际象棋游戏,我想知道我可以对它进行的优化。目前,我有一个结构游戏,有游戏的当前状态(主菜单,暂停菜单,播放等),回合,3个整数作为布尔,指针到一个板和指针到选定的部分: 棋盘有一个2D指针数组,指向棋子、玩家和最后移动的棋子(在过去): 最后是这首歌: