박오이님
무미건조한 개발자
박오이님
전체 방문자
오늘
어제
  • 뭥미 (101)
    • 프로젝트 (8)
      • 자가 보호 (3)
      • 주식 시장 분석 도구 (5)
    • 보안 (7)
      • 개론 (2)
      • 웹 (2)
      • 시스템 (2)
    • 개발 (69)
      • C++ (12)
      • Win32 (7)
      • MFC (2)
      • 자료구조 (8)
      • 알고리즘 (22)
      • 백준 (9)
      • 프로그래머스 (4)
      • LeetCode (0)
      • 개발자 면접 준비 (4)
      • OpenGL (1)
    • 서적 (13)
      • Effective C++ (9)
      • Effective Modern C++ (4)
    • 관심사 (4)
      • 재테크 (4)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 에라토스테네스의 체 #C #C++ #개발 #알고리즘 #BFS #DFS #백준 #백준알고리즘
  • 윈도우
  • 플로이드와샬알고리즘 #최단경로 #백준 #알고리즘 #개발 #C #C++
  • 합집합찾기
  • 알고리즘
  • 최소간선비용
  • 안경잡이개발자
  • 프로세스메모리
  • 윈도우개발자
  • vcpkg
  • 개발
  • DFS #BFS #알고리즘 #프로그래밍 #코딩테스트 #코딩 #C++ #C
  • JSON
  • C
  • CPP
  • Functional
  • jsoncpp
  • 나동빈 #알고리즘 #동빈나
  • std
  • EffectiveC++
  • C++
  • 시스템프로그래밍
  • 코딩컨벤션
  • 에라토스테네스의 체 #알고리즘 #개발 #C #C++ #소수 #소수판별
  • 윈도우프로그래밍
  • 동빈나
  • 나동빈
  • 윈도우시스템프로그래밍
  • 백준 #알고리즘 #플로이드와샬 #DFS #BFS #C #C++
  • 크루스칼알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
박오이님

무미건조한 개발자

개발/C++

Copy Elision, RVO

2022. 7. 7. 00:34

Copy Elision (복사 생략)

Cppreference 내용을 발췌하면, Omits copy and move(since C++11)constructors, resulting in zero-copy pass-by-value semantics.
해석하면, 복사 및 이동 생성자를 생략해서, 값별 복사 의미를 0으로 만듭니다.

뭐, 값에 의한 전달을 쓰면서, 복사 및 이동 생성자를 생략하는 경우를 의미하는 것 같네....
그래서 특정 조건을 만족하면 컴파일러가 임의로 최적화를 위해 복사 및 이동 연산을 생략합니다

사실 이거를 공부하게 된 이유가 있는데, 다들 제 블로그를 보신다면 댓글로 알려주세요..제발!!!!
그 코드를 공개할게요.. 제발 아직도 이해가 안가..

#include <iostream>
#include <map>

struct _stFoo{
	std::string aFilePath;
	std::string bFilePath;
	std::string cFilePath;
};
class Foo {
public:
	Foo();
	virtual ~Foo();

public:
	const std::map<std::string, _stFoo> GetMapValue() const;
	const std::map<std::string, _stFoo>& GetMapRef() const;
private:
	std::map<std::string, _stFoo> m_map;
};


const std::map<std::string, _stFoo> Foo::GetMapValue() const
{
	return m_map;
}

const std::map<std::string, _stFoo>& Foo::GetMapRef() const
{
	return m_map;
}

int main(int argc, char* argv[])
{
	Foo f;
	std::map<std::string, _stFoo> temp;

	temp = f.GetMapValue();
	temp = f.GetMapRef();

	return 0;
}

위 코드 중 GetMapValue()와 GetMapRef() 가 효율측면에서 차이가 날까요? 의미가 다른가요? C++11 환경입니다.
테스트 코드 짜봤으나, 의미가 없어보여서 너무 궁금합니다

이어서.

RVO (Return Value Optimization)
컴파일러는 개체의 복사 연산자를 파기, 생략? 합니다.
makeRVOObject() 함수는 복사 생성자를 호출할겁니다. 그러나, 복사 생성자를 생략합니다.

#ifndef _RVO_INCLUDED_
#define _RVO_INCLUDED_
#include <iostream>
class RVO {
public:
	RVO();
	RVO(const RVO& rhs);
};

void RVO_Test();
#endif

///////////////////////////////////////////////////////////////////////////////
#include "RVO.h"
RVO::RVO()
{

}

RVO::RVO(const RVO& rhs)
{
	std::cout << "Copy Constructor" << std::endl;
}

RVO makeRVOObject()
{
	return RVO();
}

void RVO_Test()
{
	RVO rvo = makeRVOObject();
}

컴파일러는 호출자의 스택 프레임에 숨겨진 개체를 만들고 이개체의 주소를 함수에 전달할 수 있습니다.
이 함수의 로직에 따라 반환 값이 변경되는 경우가 있습니다.

여기까지만 정리를 하는데, 내용을 찾아보니 const를 붙이면 컴파일러가 최적화로 판단할 여지가 더 많이 있다고합니다.

그럼 위에 궁금하다고 했던 코드는 RVO가 둘 다 적용되서 차이를 없을 것같기도하네요..

저작자표시 (새창열림)

'개발 > C++' 카테고리의 다른 글

람다 표현식 (lambda expression)  (0) 2022.08.19
EBO (Empty Base Optimization)  (0) 2022.07.17
std::function 이란?  (0) 2022.04.11
JsonCpp 사용법  (2) 2022.02.04
map ? unorderd_map ?  (0) 2021.08.09
    '개발/C++' 카테고리의 다른 글
    • 람다 표현식 (lambda expression)
    • EBO (Empty Base Optimization)
    • std::function 이란?
    • JsonCpp 사용법
    박오이님
    박오이님
    긍정도 아니고 부정도 아닌 0

    티스토리툴바