분류 전체보기(30)
-
std::intializer_list는 어떻게 생성 및 파괴될까?
std::initializer_list는 단순히 특정 타입 오브젝트의 배열이 아니다. 정확히 말하면 initializer_list는 컴파일러가 생성한 임시 배열(temporary array)의 포인터와 크기를 들고있는 오브젝트이다. 다음 코드를 보자. 6번 라인을 보면 0~9까지 총 10개의 원소로 initializer_list를 초기화했다. 그냥 척 보기에는 list 변수가 10개의 int를 들고있는 배열로 보이는데, 6번 라인의 어셈블리를 확인해보자. 먼저 read-only 메모리에 우리가 입력한 0~9까지의 숫자들이 .Lconstinit 레이블로 저장된 것을 볼 수 있는데, 어셈블리 5~8번 라인을 보면 .Lconstinit 레이블에 있는 0~9까지의 40byte를 스택 메모리 [rbp - 56]에..
2022.09.16 -
std::string_view를 값으로 전달해야 하는 3가지 이유 (번역)
원문 Three reasons to pass std::string_view by value It is idiomatic to pass std::string_view by value. Let’s see why. quuxplusone.github.io std::string_view를 값으로 전달하는 것은 관용적입니다. 왜 그런지 봅시다. 첫째, 약간의 배경을 설명해보죠. C++에서, 모든 것들은 기본적으로 값으로 전달(pass-by-value)됩니다. Widget w라고 하면 여러분은 완전히 새로운 Widget 객체를 얻을 수 있습니다. 하지만 큰 객체들을 복사하는 것은 성능적으로 비쌀 수 있습니다. 그래서 우리는 "값 전달"의 최적화로써 "const 참조 전달"을 사용하며, 사람들에게 std::string..
2022.09.13 -
Empty Base Optimization
C++은 모든 오브젝트가 최소 1byte의 크기를 가지고 있어야 하는데, 같은 타입의 오브젝트들의 주소 값이 각각 구별되어야 하기 때문이다. 이 제약은 클래스 멤버 변수로 선언된 객체와 같은 member suboejct라고 달라지지 않는데, 이 제약이 적용되지 않을 때가 있다. 바로 크기가 0인 클래스가 상속된 경우이다. 다음 코드를 보자. struct Base { // Nothing } struct Derived : Base { int x; } 어떤 자식 클래스의 객체를 생성하면 멤버 변수의 객체들 뿐만 아니라 부모 클래스 객체 또한 생성되는데, 이 부모 객체를 base class subobject라고 하며, 멤버 변수들을 member subobject라고 한다. 따라서 위 코드의 Derived 클래스..
2022.09.13 -
zwlog. C++ 로깅 라이브러리
프로젝트 명 zwlog 목적 모던 C++ 기능들에 익숙해지고 다른 프로젝트에도 사용할 겸 간단한 로깅 라이브러리 개발 언어 및 라이브러리 C++, CMake 기능 - 기본적으로 콘솔, 파일, 메시지 박스 로그 타겟 지원 및 확장 가능 (IMGUI 등) - 기본적으로 사용자 메시지만 출력하는 포맷터와 소스 코드의 정보(파일 명, 함수 명 등)을 포함한 포맷터 지원 및 확장 가능 - 로그 타겟별로 포맷터 설정 - 로그 심각성(Info, Warning, Error 등) 단계 커스터마이징 - 로그 타겟들을 그룹화하여 특정 그룹에게만 로그를 보내는 기능 Git GitHub - eunho5751/zwlog: zwlog is a simple logging library written with modern C++ fe..
2022.09.06 -
7+. 동차 좌표계 (보충)
이전 글에서 동차 좌표계의 $w \neq 0$인 경우에 대해 알아보았는데, 경우에 따라서 $w = 0$인 경우도 있을 수 있다. 이번 장에서는 $w = 0$인 경우와 $w \neq 0$인 경우가 어떤 차이가 있는지에 대해 알아보도록 한다. 먼저 동차 좌표계는 $(x, y, w)$와 같이 나타낼 수 있으며, $w \neq 0$일 때는 $w$로 나누면 항상 $(\frac{x}{w}, \frac{y}{w}, 1)$가 되어 직교 좌표를 구할 수 있었다. 이제 $w$가 $0$으로 수렴한다고 가정해보자. $w \neq 0$일 때는 $w$로 나눠서 아핀 공간의 점 $(\frac{x}{w}, \frac{y}{w})$에 대응할 수 있었던 것과는 달리, $w\rightarrow0$일 때는 $(\infty, \infty)$..
2022.08.10 -
7. 동차 좌표계(Homogeneous Coordinates)와 아핀 변환 행렬(Affine Transformation Matrix)
이전 글에서 아핀 변환에 대해 알아보았는데, 마지막 부분에 해당 글에서 소개한 아핀 변환에 대한 정보로는 컴퓨터 그래픽스에서 실용성이 떨어진다고 언급하였다. 이번 글에서는 그 이유와, 해결 방법인 동차 좌표계(Homogeneous Coordinates)에 대해 알아보자. 선형 변환의 장점은 행렬로 나타낸 여러 선형 변환들을 합성하여 하나의 행렬로 나타낼 수 있으며, 이로 인해 각 벡터에 모든 선형 변환을 차례로 적용하는게 아니라, 합성된 선형 변환 하나만 곱해주면 되므로 계산이 훨씬 줄어든다. $$ L_0(\mathbb{x}) = M_0\mathbb{x} \\ L_1(\mathbb{x}) = M_1\mathbb{x} \\ \vdots \\ L_{n-1}(\mathbb{x}) = M_{n-1}\mathbb..
2022.08.08