返回值优化 返回值优化Return value optimization缩写为RVO是C的一项编译优化技术即删除保持函数返回值的临时对象这可能会省略两次复制构造函数即使复制构造函数有副作用 典型地当一个函数返回一个对象实例一个临时对象将被创建并通过复制构造函数把目标对象复制给这个临时对象C标准允许省略这些复制构造函数即使这导致程序的不同行为即使编译器把两个对象视作同一个具有副作用 include iostream struct C  C  Cconst C  stdcout  A copy was maden   C f  return C  int main  stdcout  Hello Worldn C obj  f  对于函数返回类对象一种实现办法是在函数调用语句前在stack frame上声明一个隐藏对象把该对象的地址隐蔽传入被调用函数函数的返回对象直接构造或者复制构造到该地址上例如 struct Data  char bytes  Data f  Data result    generate result return result  int main  Data d  f  可能产生的代码如下 struct Data  char bytes  Data  fData  hiddenAddress  Data result    copy result into hidden object hiddenAddress  result return hiddenAddress  int main  Data hidden  create hidden object Data d  fhidden  copy the result into d  这引起了Data对象被复制两次 另一种技术是命名返回值优化Named return value optimizationNRVONRVO去除了基于栈的返回值的构造与析构虽然这会导致优化与未优化的程序的不同行为 struct Data  char bytes  void fData p   generate result directly in p  int main  Data d fd  大部分C编译器均支持返回值优化在某些环境下编译器不能执行此优化一个常见情形是当函数依据执行路径返回不同的命名对象或者命名对象在asm内联块中被使用 include iostream struct C  Cint j  i  j  Cconst C  stdcout  A copy was maden  int i  C fbool cond  false  C first C second  the function may return one of two named objects  depending on its argument RVO might not be applied return cond  first  second  int main  stdcout  Hello Worldn C obj  ftrue