Skip to content

Instantly share code, notes, and snippets.

1. 생성자가 protected/private인 경우
생성자가 protected/private인 경우 일반적으로는 개체를 생성할 수가 없다.
class C {
C();
};
int main()
{
@juggler3
juggler3 / Forward Reference
Created July 29, 2019 13:06
Forward Reference
perfact forwarding
완벽한 전달 : 레버 함수가 인자를 받아서 원본 함수에게 완벽하게 전달하는 개념.
std::forward<T> : lvalue를 인자를 받아서 T의 타입에 따라 lvalue, rvalue로 캐스팅.
std::move<T> : universal reference를 취해서 해당 오브젝트에 대한 rvalue reference로 캐스팅.
template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType = remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
@juggler3
juggler3 / Reference Initialization
Created July 22, 2019 14:05
Reference Initialization
rvalue reference 문법은 타입&& 과 const 타입&& 로 선언.
value참조와 rvalue 참조는 초기화 될 때 와 overload resolution 에서 다르게 동작.
Lvalue 참조와 Rvalue 참조는 “무엇을 바인드 하려고 하는가?” 와
“무엇이 lvalue참조와 Rvalue참조 타입으로 바인드 될것인가?” 구분.
초기화 될때에 따른 구분 표
( -> : 바인드 가능함.)
Lvalue Const Lvalue Rvalue Const Rvalue
@juggler3
juggler3 / Reference Collapsing
Last active July 22, 2019 13:50
Reference Collapsing
1. universal reference
(&&) 이슈의 핵심은 때로는 rvalue reference를 의미하나, 때로는 rvalue 또는 lvalue reference로 해석된다는 것이다.
분명히 구문상 생긴 것은 rvalue reference인 것 같은데, 실제 의미는 lvalue reference일 수 있다는 것이다.
이렇게 특이한 유연성을 가지는 reference를 가리켜, universal reference 라고 한다.
2. Reference Collapsing
컴파일러가 타입을 추론하는 과정에서의 결과로써, 레퍼런스의 레퍼런스가 발생하는 경우들이 있다.
이렇게 발생한 레퍼런스의 레퍼런스에 대해 reference collapsing을 수행하게 되며,
이것이 바로 universal reference가 lvalue reference 또는 rvalue reference로 해석될 수 있는 기본 메커니즘이다.
@juggler3
juggler3 / Temporary Object
Last active July 9, 2019 00:39
Temporary Object
임시 객체의 생성과 수명
- 이름이 있을 경우는 함수 {}을 벗어날때
- 이름이 없을 경우 문장의 끝(;)
임시 객체의 특징
- Lvalue가 될 수 없음.
- 주소를 구할 수 없음.
- 참조로 참조 할 수 없음.
-> obj& o = obj()
g++ compiler에서는 error가 나지만 ms에서는 error가 나지 않으나 정상동작하지 않음.
@juggler3
juggler3 / Copy Elision
Created July 1, 2019 15:02
Copy Elision
1. Copy Elision
1. RVO, NRVO
- C++17 이전에도 Copy Elision(복사 생략) 개념은 RVO/NRVO 등을 통해 표준의 한 부분으로 존재.
- RVO/NRVO는 함수의 반환값이 특정 객체의 값 형식일 때 복사 생성을 회피할 수 있도록 컴파일러 최적화를 의미.
RVO : 특정 객체를 생성하여 리턴, VS2005 이전 부터 지원
NRVO : return문 이전에 생성한 객체를 리턴, VS2005 부터 지원
- 최적화를 사용 안하는 (/Od) 옵션 빼고는 다 NRVO 기술을 사용한다.
- RVO는 최적화 옵션에 상관없이 무조건 사용.
NRVO는 최적화 옵션 /O1부터 동작, 즉 Debug 모드에서는 동작하지 않음.
@juggler3
juggler3 / Move Semantics
Last active June 18, 2019 01:18
RValue Reference
1. Move constructor & move assignment operator
- 객체의 상태를 다른 객체로 복사할 경우가 발생.
- 객체의 모든 정보를 복사하기 위한 깊은 복사가 발생하는데 이때 복사생성자/복사 대입 연산자를 이용 하여 처리 된다.
- 하지만 이동 처리 시 비효율적으로 처리가 되는데 이것을 보완하기 위해 이동 생성자/이동 할당 연산자가 만들어짐.
2. Move Semantics
- 이동 생성자나 이동 할당 연산자의 구현 원리는 복사 생성자나 할당 연산자의 원리와 유사.
- rvalue reference를 이용.
- 그리고 Move Semantics와 Copy Semantics의 같은 점은 자신과 동일한 타입의 객체를 인자로 받아서 새롭게 생성한 객체에 해당 내용을 이식해 준다는 것이다.
- 그러나 Copy Semantics의 경우에는 멤버 변수를 위해 새로 생성한 인스턴스에 메모리를 항당해야 하지만, Move Semantics에서는 메모리 할당을 하지 않아도 된다.
@juggler3
juggler3 / Lvalue vs RValue
Last active June 11, 2019 14:34
Lvalue vs RValue
1. Lvalue
- 대입 시 왼쪽 혹은 오른쪽에 오는 식
- 객체를 참조하는 표현식.
- 메모리 위치를 가지고 있음.
2. Rvalue
- 대입 시 오른쪽에만 오는 식.
- "모든 표현식은 Lvalue 거나 Rvalue이다" 고로, Rvalue 는 Lvalue 가 아닌 모든것.
- 구분가능한 메모리 영역을 가지는 객체를 나타낼 필요가 없는 표현식.(임시로 존재하는것일수 있다).
- int i = 1;
@juggler3
juggler3 / Modern Effective C++ 32장
Last active June 3, 2019 14:10
Modern Effective C++ 32장
Modern Effective C++ 32장 객체를 클로저 안으로 이동하려면 초기화 갈무리 사용
개요
- c++14에서는 임시 변수를 생성하고 초기화 할 수 있으며, 임시 변수의 타입은 자동 추론된다.
- by value, by reference에 의한 캡쳐만 있는게 아니라
std::unique_ptr, std::future 같은 객체를 std::move 를 통해 캡쳐하는 경우 발생하는데
c++11에서는 캡쳐 초기화의 방식이 어려움이 있음.
- c++11에서는 functor, std::bind를 이용 하여 구현 할 수 있음.
- c++14에서는 갈무리 초기화 기능으로 가능.
@juggler3
juggler3 / Modern Effective C++ 14장
Last active May 14, 2019 00:19
Modern Effective C++ 14장
Modern Effective C++ 14장 예외를 방출하지 않을 함수는 noexcept로 선언
개요
- c++98에서 exception 추가 되었으나 함수 구현과 예외 명세 일관성 유지등 구현에 어려움이 많았음.
- c++11에서는 noexcept 키워드를 통해 예외 발생 유무를 알수 있어 설계 시 중요한 역할을 함.
- noexcept를 사용 해서 예외를 발생 하지 않는 다는 것을 보장 하여 예외 관련 스택이 불필요.
1. c++98 throw()
- c++98에서도 throw()함수를 호출하여 예외를 발생하지 않는 방법이 존재.
- 해당 throw()를 호출한 함수까지의 Stack Unwinding(스택되감기) 되고 난 뒤 프로그램이 종료.