copy elision

      Comments Off on copy elision

Trình biên dịch sẽ bỏ qua copy constructor để tối ưu hóa trong 1 số trường hợp đặc biệt là trong trường hợp return value.

Ví dụ 1:

#include <iostream>

int n = 0;
struct C {
  explicit C(int) {}
  C(const C&) { ++n; } // the copy constructor has a visible side effect
};                     

int main() {
  C c1(42); // direct-initialization, calls C::C(42)
  C c2 = C(42); // copy-initialization, calls C::C( C(42) )
  
  std::cout << n << std::endl; // prints 0 if the copy was elided, 1 otherwise
  return 0;
}

Giá trị print ra là: 0 ==> copy constructor đã được bỏ qua.

Ví dụ 2:

#include <iostream>

struct C {
  C() {}
  C(const C&) { std::cout << "A copy was made.\n"; }
};

C f() {
  return C();
}

int main() {
  std::cout << "Hello World!\n";
  C obj = f();
  return 0;
}

In ra

Hello World!

Nếu disable copy elison bằng cờ: -fno-elide-constructors thì nó sẽ in ra:

Hello World!
A copy was made.
A copy was made.

Trong trường hợp này trình biên dịch sẽ hoạt động như sau:


struct Data { 
  char bytes[16]; 
};

void f(Data *p) {
  // generate result directly in *p
}

int main() {
  Data d;
  f(&d);
}