반응형

프로그래밍/C/C++ 15

C++ rvalue reference (우측값 참조) move semantics

이전 정리글은 2022.01.05 - [프로그래밍/C/C++] - C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자) C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자) c++ lvalue 와 rvalue lvalue 와 rvalue 라는 무엇인가 ? 말그대로 좌측값과 우측값인데 c++ 에서 의미는 다음과 같이 생각하면 된다. lvalue 같은 경우에는 표현식 이후에도 사라지지 않고 지속되는 변수 또 nanze.tistory.com move semantics move semantics 는 이전 정리에서도 말했지만 객첵의 자원이 다른 객체의 자원으로 이동하는 것을 의미한다. 우측값 참조는 이러한 메카니즘을 ..

C++ Lvalue (좌측값) Rvalue (우측값) Rvalue reference (우측값 참조자)

c++ lvalue 와 rvalue lvalue 와 rvalue 라는 무엇인가 ? 말그대로 좌측값과 우측값인데 c++ 에서 의미는 다음과 같이 생각하면 된다. lvalue 같은 경우에는 표현식 이후에도 사라지지 않고 지속되는 변수 또는 객체라고 생각하면 된다. 사라지지 않는다는 것은 그것을 지칭할 수 있는 무엇인가 있다는 것이고 그것은 "이름"이 될 것이다. 그러니 lvalue 는 이름을 가지고 있다. 따라서 모든 변수는 lvalue 라고 볼 수 있다. 반대로 rvalue 같은 경우 표현식 이후에는 존재하지 않는 임시적인 무엇이다. 임식 객체 또는 상수 등은 rvalue 라고 볼 수 있을 것이다. 다음 코드를 확인해 보자. #include #include int main() { int a = 0; //변..

C++ lambda expression 람다 표현식

C++ 11 부터 지원하기 시작한 람다 표현식에 대해서 정리해보자. 람다 표현식의 구성은 다음과 같다. 캡쳐블록 + 파라미터 목록 + mutable (생략) + throw (생략) + 리턴타입 (생략) + 함수바디 [캡쳐블록](파라미터 목록) mutable throw ->리턴타입 {함수바디} 캡쳐블록 캡쳐블록은 [ ] 로 감싸지며 람다 표현식 안에서 참조하는 외부 변수를 지정한다. 변수 지정시 표현식에 따라 의미가 다른데 알아보자. [=] : 외부 모든 변수 값을 복사하며 객체의 멤버함수에서 람다 호출 시 this 포인터도 전달된다. 또한 변수 값으로 복사 시에는 const 로 이루어지기 때문에 기본적으로 수정이 되지 않는다. 값으로 복사 된 변수의 값 수정이 필요할 경우 에는 mutable 키워드를 이..

c++ 템플릿 가변인자 Variadic template

항상 자주 마주치지만 익숙하지 않은 템플릿에 대해서 정리해보자. 템플릿에서 인자로 받을 수 있는 것은 무엇이 있을까? 일단 변수는 되지 못한다. 그리고 실수 값도 사용이 불가하다. 그렇다 템플릿 인자로 가능한 것은 정수형 상수이거나 타입일 경우에만 가능하다. 다음의 코드를 보자. template class CTemplateTest { T tName[SIZE]; }; int main() { CTemplateTest test1; CTemplateTest test2; // 정수값만 가능. CTemplateTest test3; //템플릿 인자를 명시해야 함 int value = 10; CTemplateTest test4; //변수 불가능. CTemplateTest test5; return 0; } 위 코드는 템..

소멸자 명시적 호출의 주의점 ?

음 메모리 풀을 구현하다 경험한 것을 정리한다. 인터넷에서 검색을 해봐도 잘 보이질 않고 물어볼 사람도 없어서 추정의 글을 적는다. 혹시라도 누군가 본 후 틀렸다면 정보를 제공하면 고마울 것 같다. 일단 코드부터 보자. template class NzOPool { public : NzOPool(int nMaxSize = 20) : m_nMaxSize(nMaxSize){ for(int i =0; i~T(); free(pObj); } } } T* Pop() { T* pRet = nullptr; if( m_queObjs.try_pop( pRet ) == false){ pRet = (T*)malloc( sizeof(T)); ++m_nMaxSize; } new (pRet) T(); //생성자 명시적 호출 retu..

반응형