2016년 3월 16일 수요일

[c++] 임시 객체



임시 객체 

  1. int a = 3 + 4;  
 위와 같이 선언된 문장이 있다. 우리는 보통 생각하기에 이 문장은 int 형 데이터가 4Byte 이므로 메모리 공간에 4Byte의 메모리 공간만 할당한다고 생각하겠지만, 이 경우에 메모리 공간에 3과 4라는 상수도 CPU에 의해서 연산이 이루어 져야 하므로 메모리 공간에 올라간다. 
 그럼 이렇게 상수도 메모리 공간에 올라가니까 다음 라인에서 이 숫자를 참조가 가능할까? 불가능하다. 물론 변수 a는 참조가 가능하다. 무슨 차이가 있을까? 바로 상수3과 4는 변수 a와 같이 이름이 없기 때문이다.
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class AAA{  
  5.     char name[20];  
  6. public:  
  7.     AAA(char* _name){  
  8.         strcpy(name, _name);  
  9.         cout<<name<<" 객체 생성"<<endl;  
  10.     }  
  11.     ~AAA(){  
  12.         cout<<name<<" 객체 소멸"<<endl;  
  13.     }  
  14. };  
  15.   
  16. int main(void)  
  17. {  
  18.     AAA aaa("aaa Obj");  
  19.     cout<<"--------임시 객체 생성 전---------"<<endl;  
  20.     AAA("Temp Obj");  
  21.     cout<<"--------임시 객체 생성 후---------"<<endl;  
  22.     return 0;  
  23. }  
 위 소스 코드는 임시 객체 생성 코드 이다. 여기에서 AAA("Temp Obj");는  AAA aaa("aaa Obj"); 와 비교해보면 무엇이 틀린지 금방 알 수 있다. 바로 AAA("Temp Obj")는 이름이 없다. 이 문장은 AAA라는 객체 클래스를 생성하는데 "Temp Obj"라는 문자열을 받는 함수를 호출하라는 의미이다. 물론 객체는 생성하지만, 이름이 없어서 해당 라인을 벗어나면 바로 소멸 된다. 이렇게 만들어지는 순간은 존재했다가 해당 라인에서 벗어나면 소멸하는 객체를 바로 임시 객체 라고 한다. 임시 객체의 생성과 소멸은 결과를 보면 충분히 이해 할 수 있을 것이다. (해당 라인에서 생성, 벗어나자마자 소멸을 cout으로 출력해주는것을 볼 수 있다.)

 이 임시객체라는 것은 경우에 따라서는 컴파일러에 따라 최적화가 되기 때문에 가급적이면 사용하는 것이 좋다. 위의 예제를 임시객체를 이용해 다음과 같이 바꿀 수도 있을 것이다. 


댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...