본문 바로가기
프로그래밍/C++

C++ 임시 객체에 대해서

by bantomak 2026. 1. 25.
반응형

갑자기 만난 이상한 문법의 코드

아래의 코드를 살펴보자. generator 변수를 초기화하는데 초기값으로 hash<thread::id>() (...) 이런 식으로 호출되는 부분이 있다.

함수도 아니고 뭔지 몰라서 찾아보니 hash<thread::id> 타입의 임시 객체를 생성해서 () 연산자로 호출한 코드였다.

하나씩 알아보자.

int rendGen(const int& min, const int& max)
{
	static thread_local mt19937 generator(hash<thread::id>() (this_thread::get_id()));
	uniform_int_distribution<int> distribution(min, max);

	return distribution(generator);
}

풀어서 코드를 작성해보면 아래와 같다.

int rendGen(const int& min, const int& max)
{
	hash<thread::id> hash;
	auto result = hash(std::this_thread::get_id());

	static thread_local mt19937 generator(result);
	uniform_int_distribution<int> distribution(min, max);

	return distribution(generator);
}

결국은 임시 객체다

풀어서 천천히 살펴보니 이해가 되기 시작한다. 그저 코드를 간결하게 작성하기 위해서 이름이 없이 임시 객체로 () 연산자를 호출하여 인자로 넣은 것뿐이다.

 

여기서 임시 객체(Temporary Object)란, 코드 상에서 명시적인 이름 없이 생성되었다가, 해당 문장이 끝나면 곧바로 소멸하는 객체를 의미한다. 주로 연산 과정에서 중간 값을 저장하거나, 함수에 인자를 전달할 때 사용한다.  개발자 입장에서는 불필요한 복사 비용을 유발하기도 하지만, 현대 C++에서는 이를 최적화의 도구로 활용하기 한다.

임시 객체를 사용하는 상황들

  • 함수 인자로 사용할 때
  • 반환값으로 사용할 때
  • 연산의 중간 결과
  • 함수 객체를 한 번만 쓸 때

임시 객체를 효율적으로 사용하기

과거에는 임시 객체로 인한 불필요한 복사 생성(Copy)이 성능 저하의 주범이었다. 하지만 현대 C++에서는 이를 해결하기 위한 강력한 두 가지 무기를 제공한다.

  • RVO (Return Value Optimization) : 컴파일러가 반환용 임시 객체를 아예 만들지 않고, 반환받을 메모리에 직접 객체를 생성하는 기술, C++ 17부터는 특정 상황에서 의무화(Guaranteed Copy Elision)되었다.
  • 이동 의미론 (Move Semantic) : 임시 객체는 어차피 곧 사라질 운명이다. 따라서 데이터를 "복사"하는 대신, 임시 객체가 가진 자원을 뺏어오는(Move) 것으로 복사를 대신한다.

임시 객체로 operator() 생성자 호출하기

  • myClass란 이름의 객체를 만들어서 () 연산자 호출하기
  • T() () 형식으로 연산자 호출하기
  • T{} () 형식으로 연산자 호출하기
class MyClass22
{
public:
	int operator()(int x) { return x * 2; }
};

void main()
{
	MyClass22 myClass;
	std::cout << myClass(22) << std::endl;
	std::cout << MyClass22() (44) << std::endl;
	std::cout << MyClass22{} (44) << std::endl;
}

정리하자면

  • 임시 객체는 이름이 없고, 세미콜론(;)을 만나면 사라진다.
  • 불필요한 생성을 줄이는 것이 성능 최적화의 핵심이다.
  • 이동 생성자와 RVO 덕분에 현대 C++에서는 임시 객체를 훨씬 효율적으로 사용하게 되었다.

함께 읽으면 좋은 글

 

C++ 기본 타입은 왜 std::move()로 이동되지 않는가?

기본 타입(Primitive Type) 이동시키기우선, 기본 타입인 int를 복사하고 이동시키는 코드를 작성해 보자.std::vector vec;int a = 1;vec.push_back(a); // copystd::cout 결과를 보면 std::move()를 사용했지만 이동 대입

jettstream.tistory.com

댓글