#include <iostream>
#include <string.h>
using namespace std;
class Obj {
private:
char objname[10];
char *data;
public:
Obj(char *name) {
strcpy(objname, name);
cout << "[" << objname << "] create" << endl;
data = new char[11];
for (int i = 0; i < 10; i++) {
data[i] = 'a' + i;
}
data[10] = 0;
}
Obj(const Obj &obj) {
cout << "[" << obj.objname << "] is copied." << endl;
strcpy(objname, obj.objname);
data = obj.data;
}
~Obj() {
cout << "[" << objname << "] deleted" << endl;
delete [] data;
}
};
Obj getObj(char *name) {
Obj temp(name);
return temp;
}
int main() {
Obj a("a");
Obj b = Obj("b");
Obj c = getObj("c");
getObj("d");
b = getObj("e");
cout << "---end---" << endl;
return 0;
}
RVO 적용 | RVO 미적용 | |
Obj a("a"); | 임시객체 사용 없이 생성되므로 정상 생성 | 임시객체 사용 없이 생성되므로 정상 생성 |
Obj b = Obj("b"); | Obj("b") 생성 시 컴파일러가 임시객체 생성하지 않고 바로 Obj b로 생성해 버림.(최적화 적용) | Obj("b") 임시객체를 생성 후 복사생성됨. Obj("b") 임시객체는 삭제됨. |
Obj c = getObj("c"); | getObj() 호출 시 컴파일러가 Obj temp가 큰 변화 없이 바로 return되는 객체임을 알고 있음. 따라서 임시객체 생성하지 않고 바로 Obj c로 생성해 버림. (최적화 적용, temp 이름이 있어서 NRVO임) | getObj() 안에서 temp 객체 생성됨. return되면서 임시객체를 temp객체로 복사생성 후 temp객체 삭제됨. Obj c를 임시객체로 복사생성 후 임시객체 삭제됨. 즉 여기서는 불필요하게 temp객체를 임시객체로, 임시객체를 c 객체로 2번이나 복사생성하고 있음. |
b = getObj("e"); | 이건 생성은 아니긴 함 추후 디버깅 | 추후 디버깅 |