Copy Elision หรือ Copy Omission เป็นหนึ่งในเทคนิคการเพิ่มประสิทธิภาพของคอมไพเลอร์ (compiler optimization technique) เทคนิคนี้หลีกเลี่ยงการคัดลอกออบเจกต์ที่ไม่จำเป็น คอมไพเลอร์เกือบทุกตัวในปัจจุบันใช้เทคนิค Copy Elision นี้
ลองดูวิธีการทำงานผ่านโค้ดตัวอย่างต่อไปนี้
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
class MyClass {
public:
MyClass(const char* str = "\0") { // default constructor
cout << "Constructor called" << endl;
}
MyClass(const MyClass &my_cls) { // copy constructor
cout << "Copy constructor called" << endl;
}
};
int main() {
MyClass ob = "copy class object";
}
ผลลัพธ์
Constructor called
ทดลองคิดว่าทำไม copy constructor จึงไม่ถูกเรียก?
เมื่อออบเจกต์กำลังถูกสร้างขึ้น จะมีออบเจกต์ชั่วคราว (temporary object) สร้างขึ้นหนึ่งตัว และคัดลอกไปยังออบเจกต์จริง ดังนั้นภายในจะดูเหมือนกับนี้
MyClass ob = "copy class object";
จะทำงานเหมือนกับ
MyClass ob = MyClass("copy class object");
คอมไพเลอร์ C++ หลีกเลี่ยง overhead ประเภทนี้