전체 글

전체 글

    [C++] Type Punning (타입 장난)

    [C++] Type Punning (타입 장난)

    Type Punning (타입 장난) 타입을 가지고 장난을 친다는 것이다. 어떤 타입을 나타내는 메모리 공간을 다른 타입으로 읽어서 조작한다는 개념이다. C++는 pointer 라는 개념이 있기때문에 타입 퍼닝이 쉽게 가능하다. 흔한 타입 퍼닝 예를 보자. Example Code struct S { int a; double b; float c; }; void fn(unsigned char* addr, std::size_t length) { // send object or set object } int main() { S s; fn((unsigned char*)&s, sizeof(s)); } 구조체 S를 만들고 이를 unsigned char*로 읽는 예제이다. 위와 같은 예제 코드를 그림으로 그려보면, f..

    [C++17] std::variant

    [C++17] std::variant

    개요 이전에 Union은 몇 가지 문제를 가지고 있었다. int를 써놓고 double을 읽는 행위 (undefined behavior) Object가 들어갔을 때 타입을 바꿀때마다 직접적으로 생성자와 소멸자를 호출해줘야한다. 이러한 문제들을 해결해 줄 수 있는 것이 C++ 17 부터 추가된 std::variant인데 훨씬 더 안전한 union을 사용할 수 있도록 만들어준다. std::variant 예제 struct S // 4 +(4) + 8 + 4 + (4) = 24 { int i; // 4 double d; // 8 float f; // 4 }; union U // 8 { int i; // 4 double d; // 8 float f; // 4 }; std::variant v; std::cout

    [C++] Union

    [C++] Union

    union 잘 쓰이진 않는 union의 가장 큰 목적은 Memory Saving(메모리 절약)을 하는 것이다. 요새 임베디드 기기는 메모리가 크게 설정되지만 이 중에서도 특별한 하드웨어에서는 몇 KB만 가능한 케이스들이 있다. 이런 특수한 경우에 메모리를 절약하기 위해 사용된다. Example Code : struct와 union 비교 struct S // 4 + (4) + 8 = 16 byte { int i; // 4 byte double d; // 8 Byte }; uㅎnion U // 8 byte { int i; // 4 byte double d; // 8 byte }; 그림을 통해 어떻게 S는 16byte가 나오고 U는 8byte가 나오는지 확인해본다. union 같은 경우 하나의 공간이 있으면 ..

    [C++17] std::optional

    [C++17] std::optional

    std::optional std::optional은 C++17 부터 추가되었으며 변수나 오브젝트가 있을 수도 있고 없을수도 있다는 뜻을 의미한다. 예시로 다음 타입 스크립트 코드를 보면, function f(x: number, y? : number) { return x + (y ?? 0) } 여기서 y뒤에 물음표가 optional 인데 y 값이 정의되어있으면 y를 그대로 사용하여 x에 더한다. y 값이 정의되어있지 않다면 0을 가져다 x에 더한다. 즉, 값이 있을수도 있고 없을수도 있다라는 것이다. Example Code : Primitive Type 예제 #include std::optional divide(int a, int b) { if (b == 0) { return std::nullopt; //..

    [C++] 가상함수 원리

    [C++] 가상함수 원리

    Virtual Function (가상 함수) class Animal { public: Animal() { std::cout

    [C++] attributes(속성)

    [C++] attributes(속성)

    attributes attribute는 필수 기능도 아니고 컴파일러마다 다르게 정의되어있다. 하지만 C++ 개발을 더욱 안전하게 만들어주는 역할을 한다. 그 종류들은 다음과 같은 것들이 있다. 간단하고 유용한 몇 가지만 알아본다. [[nodiscard]] [[nodiscard]] // [[nodiscard("return value")]] // C++20 부터는 메시지를 추가할 수 있다. int fn() { // return state or error code return 0; } int main() { fn(); // 리턴값을 무시할 경우 warning 메시지가 출력된다. } 만약, error code일 수 있는 return value가 너무 중요해서 fn() caller에서 꼭 확인해야한다면 retur..

    [C++] Perfect forwarding

    [C++] Perfect forwarding

    Perfect forwarding 퍼펙트 포워딩에 알아보기전에 타입 추론에 대한 내용부터 알아야한다. template void PrintVar(T a) { std::cout

    [C++] constexpr

    [C++] constexpr

    constexpr 일반적인 const와 비슷한데 value나 연산을 컴파일 타임에 계산할 수 있으면 컴파일 타임에 계산하라는 의미이다. Example Code int cal(int a, int b, int c) { return a*b+c; } int main() { int a = 3; int b = 5; int c = 2; int d = cal(a,b,c); } 위와 같은 코드를 만든 순간 이미 컴파일러는 a,b,c의 값을 알고 있고 그 계산식 또한 알고 있다. 즉, 답이 컴파일 시간에 정해져 있다는 뜻이다. 이를 굳이 함수로 만들고 값을 넘기면서 실행할 필요없이 컴파일 시간에 계산하여 출력하면 더 빠르게 동작할 수 있을 것이다. Compiler Explorer에서 확인해보자. 어셈블리를 보면 각각의 변..