C++(15)
-
std::chrono - 1. Duration
이전 글에서 time_t 타입의 문제는 단위가 달라지면 값이 가지는 의미가 달라지는데도 정상적으로 컴파일이 된다는 것 이었다. 그럼 단위가 다르면 컴파일 에러를 띄우는 방법이 있을까? 바로, 각 단위에 대한 타입을 만들어주는 것이다. class seconds { ... } class minutes { ... } void f(seconds sec); int main() { minutes mins{10}; f(mins); // Compile Error!! f(10); // Compile Error!! } 위 예제를 보면 초(seconds)와 분(minutes)을 나타내는 각각의 클래스를 만들어주었다. 이제 main 함수를 보면 두 번의 f 함수의 호출은 실패하는데, 첫 번째는 매개변수와 인자의 타입이 다르기..
2022.09.22 -
std::chrono - 0. chrono가 왜 필요한가?
C++11 이전에 시간/날짜를 측정하기 위해서는 외부 라이브러리를 사용하거나 표준 라이브러리를 사용해야 했다. 하지만 라이브러리의 사용은 프로젝트에서 시간의 단위 변환이 많아질수록 사용이 까다롭고 버그가 발생할 확률이 높아졌는데, 그 이유는 다음과 같다. 단위 변환을 위해서 직접 특정 값을 곱하거나 나누어줘야 했으므로 프로젝트 내 특정 단위를 사용하다가 다른 단위를 사용하기로 설계를 수정한다면 모든 코드를 변경해야 한다. #include #include void g(time_t milliseconds) { std::cout
2022.09.21 -
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 -
문자열 리터럴을 템플릿 인자로 전달하는 방법
C++에서는 다음 코드와 같이 템플릿 인자로 string literal을 전달하는 것이 허용되지 않는다. template void Print() { std::cout
2022.04.02