본문 바로가기

C++8

[idiom] CRTP CRTP는 Curiously Recurring Template Pattern 의 준말로 템플릿클래스에서 사용하는 패턴이라고 한다.핵심만 말하자면 베이스 함수에서 자식의 함수를 사용하는 패턴인데왜 그렇게 하냐면 그렇게하면 가상함수를 대신 할 수 있다.가상함수는 함수 콜 시 오버헤드가 더 크기때문에 이걸 피하려고 만든 패턴인것 같아보였다. 코드는 다음과 같다templateclass Base{ void Execute() { static_cast(this)->Implementation(); }}class Derived : Base{ void Implementation() { // 오! 굿 }}int main(){ Derived d; d.Execute();.. 2025. 2. 12.
[Idiom] 반환 값 최적화 (RVO), 이름있는 반환 값 최적화(NRVO) 사실 이 두개 처음 들었을 때, 엄청 대단하고 깔끔한 코드를 만들어 낼까 생각했었다.근데 알고보니까 컴파일러가 그냥 해주는거였다. RVO,NRVO 영어를 풀면, Return Value Optimazation, Named Return Value Optimization이라더라즉 반환값을 최적화 하겠다는건데, 이게 뭐냐면Data CreateData(){ return Data();}int main(){ Data d = CreateData();} 이런 클래스를 생성함과 동시에 반환하는 함수에 대해서 컴파일러가 알아서 최적화를 해준다는 것이다.그럼 어떤 최적화를 말하는것이냐면,우리는 방금 함수를 호출했고, Data인스턴스를 생성했다. 그럼 여기서 생성자가 호출되는것은 당연하고,메인문에 있는 Data변수는 이걸 받았.. 2025. 2. 12.
[Idiom] 보편참조와 퍼펙트포워딩 회사에 들어가기 전에도 알고있던 개념이었지만 이 중요한걸 설명을 안해놓다니 ㅎㅎ..보편참조,퍼펙트포워딩,얕은복사,깊은복사 얘내들은 내가 생각하기에 하나의 세트로 묶어서 이해해야한다. 2022년에 얕은복사랑 깊은복사 설명 조금 해둔게 있긴하지만, 거기서 빠진 설명이 하나 있다.얕은복사건 깊은복사건, 프로그래머가 직접 구현해줘야한다.이동생성자에서 깊은복사해놓고 패러미터로 move썼다고 얕은복사가 되는게 아니다. 어떤 특정클래스에서 얕은복사와 깊은복사가 만약 구현이 된다면, 이제 이 클래스는 생성자의 패러미터가 좌측값인지 우측값인지 민감하게 반응을 하게 된다. 보편참조위 내용을 기억한 채로 보편참조를 알아보자. 보편참조는 템플릿에서 사용되는 개념인데, 패러미터에 앰퍼선드 두개를 붙히면 좌,우측값 상관없이 모두.. 2025. 2. 12.
[Idiom] 언리얼엔진에서 배워온 TypeDispatch 이번에 설명할 것은 TypeDispatch 라는 Idiom인데이 Idiom을 알아낸 계기가,프로젝트에서 네트워크 최적화를 하다가 NetSerialize라는 함수를 UStruct에 구현하면서 알게되었다.언리얼엔진은 Ustruct의 시리얼라이징을 커스터마이징 할 수 있다. (변수단위 리플리케이션 조작 가능)그때 쓰는게 요따구 형태의 플래그를 주는 방식이다.templatestruct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2{ enum { WithNetSerializer = true }}이렇게 플래그를 템플릿으로 주는것을 TypeDispatch라고 하더라.이 코드를 타고 타고 타보면template struct TStruct.. 2025. 2. 12.
얕은 복사, 깊은 복사? 아마 이 키워드는 복사생성자와 이동생성자를 다루면서 들어봤을 것 이다. 복사생성자가 무엇이냐? 일반적으로 클래스를 선언할 때 컴파일러가 내부적으로 자동적으로 만들어준다. A라는 클래스가 있다면, A(const A& )라는 생성자가 자동으로 만들어진다. 즉, 동일한 클래스의 인스턴스를 받으면 고대로 그 인스턴스가 가진 값을 복사한다. 이 때, 이 자동으로 생성된 생성자가 사용된다면 내부적으로 얕은 복사가 사용이된다. 얕은 복사는 무엇이냐? 만약 A클래스가 메모리가 할당된 부분의 포인터변수를 들고있어야 한다고 가정하자, 그렇다면 이미 만들어진 인스턴스를 복사생성자의 인자로 넣게되면, 원래 존재하던 인스턴스의 포인터 주소를 새롭게 복사된 인스턴스도 포인터가 가리키게 되는것이다. 이미지에서는 왼쪽 부분이 얕은복.. 2022. 11. 29.
스마트 포인터, 강참조와 약참조 이것도 면접에서 나온 질문 스마트 포인터가 뭔지 아냐는 질문이었다. 당연히 알지, 맨날 쓰니까.. 쉐어드 포인터, 유니크포인터, 윅포인터 종류가 있고, 메모리 할당을 한 후에 사용자가 신경을 쓰지않아도, 프로그램 종료 시 메모리 할당이 자동으로 해제되는 포인터라고 설명을 했다. 쉐어드 포인터는 어떻게 동작하냐고 물어보셨는데, 쉐어드 포인터는 내부적으로 레퍼런스 카운팅을 하여 할당된 메모리가 다른 곳에서 사용될 때 카운팅이 하나씩 오르고, 레퍼런스 카운트가 0이 될 시에 메모리할당이 해제되는 방식으로 이해하고 있다고 말을했고, 서로 얽혀있는 순환참조가 발생하지 않는 이상 메모리 할당이 자동적으로 해제될 수 있다고 답했다. 그리고 면접관님이 말씀하신게, 순환참조는 어떤식으로 일어나냐고 물어보셨다. A B 클.. 2022. 11. 26.