종제로
종제로 Devlog
종제로
전체 방문자
오늘
어제
  • 분류 전체보기 (43)
    • C, C++ (22)
      • C, C++ (10)
      • Modern C++ (4)
      • 전문가를 위한 C++ (책) (8)
    • DirectX 자체엔진 개발 (8)
    • 자료구조 알고리즘 (10)
      • 공부 (9)
      • 문제풀이 (1)
    • 자기 계발 (1)
    • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++ 11
  • 전문가를 위한 C++
  • C++
  • 모두의C언어
  • 자료구조
  • 알고리즘
  • directX
  • c++ 17
  • DirectX11
  • C

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
종제로

종제로 Devlog

C, C++/Modern C++

[C++ 11] 복사 생략(Copy Elision)

2022. 4. 21. 11:41

[C++ 11] 복사 생략(Copy Elision)

컴파일러가 복사 또는 이동 연산자를 회피 할 수 있으면 회피하는 것을 허용하는 방식

Return Value Optimization / Named Return Value Optimization

 

(예시)

struct Foo
{
    Foo() { std::cout << "생성됨"; }

};

Foo RVO_F()     // Return Value Optimization
{
    return Foo();
}

Foo NRVO_F()    // Named Return Value Optimization
{
    Foo foo;
    return foo;
}

int main()
{
    // 다음 함수에서는 복사 생성 생략됨 (Debug, Release 모두)
    Foo rvo_foo = RVO_F();
    
    // 다음 함수는 모드에 따라 생략되기도하고, 안되기도 함
    // (옵션을 켜줬을 때, Release 모드에서 작동 -> Release로 빌드하는 이유)
    Foo nrvo_foo = NRVO_F();
}

 

Named Return Value Optimization (NRVO)

NRVO는 RVO에 속하는 종류로써 예전에는 이러한 NRVO_F 라는 함수 내부에 foo라는 이름을 가진 객체는 return 시켜도 최적화 시키지 않았다. 그러나 사람들이 이름을 가지더라도 최적화 시키자고 하였고 이를 NRVO(Named Return Value Optimization)이라고 부르게 되었다. 그래서 ISO/ANSI C++ 위원회에서 1996년 RVO와 NRVO의 최적화 가능을 발표하고, Visual studio 2005에 포함시키게 되었다.

 

이처럼 컴파일러는 자신도 모르는 사이에 상황에 맞게 RVO, NRVO 뿐만 아니라 다양한 최적화 기법들을 이용해서 적절한 코드로 최적화 시키는 작업을 컴파일러단에서 진행하고 있다.

 

 

참고

  • https://dydtjr1128.github.io/cpp/2019/08/10/Cpp-RVO(Return-Value-Optimization).html
저작자표시 비영리 변경금지 (새창열림)

'C, C++ > Modern C++' 카테고리의 다른 글

[C++ 11] noexcept  (1) 2022.06.27
[C++ 11] 중괄호 초기화, 초기화 리스트(Initialize List)  (0) 2022.04.21
[C++] 스마트 포인터 참고할만한 글  (0) 2021.12.22
    'C, C++/Modern C++' 카테고리의 다른 글
    • [C++ 11] noexcept
    • [C++ 11] 중괄호 초기화, 초기화 리스트(Initialize List)
    • [C++] 스마트 포인터 참고할만한 글
    종제로
    종제로

    티스토리툴바