复制省略 复制省略或者译作省略不必要的复制copy elision是C语言标准中定义的编译优化技术 当一个class类型的temporary object英语temporary variable的临时对象用于初始化同类型的对象时复制初始化通常优化为直接初始化但在语义上仍然需要复制构造函数是可访问的 例如 include iostream struct C  explicit Cint  Cconst C  stdcoutcopy constructorstdendl   the copy constructor has a visible side effect   it modifies an object with static storage duration int main  C c  directinitialization calls CC C c  C  copyinitialization elision as directinitialization so as to call CC return   上例在g与Visual C默认都是复制省略 throw语句抛出一个异常对象catch语句匹配一个异常对象默认是要执行复制构造函数的如下例 include iostream struct C  C  Cconst C  stdcout  Hello Worldn   void f  C c throw c  copying the named object c into the exception object   由于异常对象保存在线程信息块TIB中这里的复制构造不可省略 这使得调用栈上压栈保存的函数都有机会处理这个异常对象 int main  try  f  catchC c   copying the exception object into the temporary in the exception declaration   由于这里是传值的catch批配因此复制初始化不可省略 通常用于catch块可能会修改异常对象的内容但又需要把原来的异常对象重新抛出rethrow  上例默认应该打印输出两次Hello World GCC的编译选项fnoelideconstructors关闭复制省略