'C++' Temporary object

토스트·2025년 9월 16일
0

'C++' basic

목록 보기
34/35

임시 객체(Temporary object)

표현식의 평가 과정에서 잠깐 만들어졌다가, 그 표현식이 끝나면 바로 파괴되는 객체를 말합니다.

임시 객체(Temporary object)는 C++ 표준에서 사용되는 공식적인 용어로, 객체의 수명(lifetime)이 특정 표현식이나 문맥에 한정된다는 점을 강조합니다.

또한 익명 객체(Anonymous object)라고도 불리며 이름이 없다(anonymous)는 점을 강조하는 비공식적인 용어입니다.
또한 비공식으로 임시 변수(Temporary variable) 또는 익명 변수(Anonymous variable)라고도 불립니다.

반환 값 최적화(Return Value Optimization, RVO)

임시 객체(Temporary object)를 반환할 때 적용되는 최적화
함수가 익명 객체를 return할 때, 원래라면 복사 생성자(또는 이동 생성자)가 호출되어야 하는데
이를 건너뛰고 바로 호출자(call site) 쪽에서 객체를 직접 생성하는 방식으로 최적화합니다.

C++17 이후 무조건 적용

명명된 반환 값 최적화(Named Return Value Optimization, NRVO)

이름이 붙은 지역 변수(named local variable)를 반환할 때 적용되는 최적화
함수 안에서 지역 변수를 만들고 그걸 return할 때, 이 경우에도 호출자 영역에서 직접 생성되도록 최적화합니다.

NRVO는 모든 경우에 적용되는 것은 아니며 컴파일러의 재량에 달려 있어서 "걸리면 좋은 보너스" 정도로 생각하고 코드를 짜야 합니다.

예시

1. 함수 반환값 (temporary)

#include <vector>

std::vector<int> getNumbers() {
    return std::vector<int>{1, 2, 3, 4}
    // 여기서 std::vector<int>{1, 2, 3, 4}가 임시 객체
    // C++11 이후부터는 return {1, 2, 3, 4}; 형식으로도 가능
}

int main() {
    std::vector<int> v = getNumbers(); // 반환된 임시 객체 → v에 대입
}

2. 연산 결과 (temporary)

#include <string>

int main() {
    std::string a = "Hi, ";
    std::string b = "there";
    
    std::string result = a + b; 
    // operator+의 결과는 temporary std::string
}

3. 형변환에서 생성되는 temporary

int main() {
    double d = 3;  
    // int 3 → double 3.0 임시 객체로 변환됨
}

4. const 참조로 수명 연장되는 temporary

#include <string>
#include <vector>

int main() {
    const std::string& sref = std::string("temporary"); 
    // temporary std::string이 sref의 수명과 동일하게 연장됨
    const std::vector<bool>& vref = std::vector<bool>(10, false);
    // temporary std::vector<bool>이 vref의 수명과 동일하게 연장됨
}

5. 함수 인자로 전달되는 temporary

#include <iostream>
#include <string>

void print(const std::string& s) {
    std::cout << s << '\n';
}

int main() {
    print(std::string("hello"));
    // 인자로 넘어가는 std::string("hello")가 temporary
}

0개의 댓글