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 |