C++

    C++ r-value && (임시 객체) / l-value & (고유 객체, 주소값)

    C++ Lvalue와 Rvalue에 대한 오해 Lvalue와 Rvalue는 보통 Left-value(왼쪽값)과 Right-value(오른쪽값)로 풀어서 쓴다. C 표준에서는 대입 연산자(=)를 기준으로 왼쪽과 오른쪽에 모두 사용될 수 있는 값은 Lvalue이고 오른쪽에만 사용될 수 있는 값이 Rvalue라고 정의하고 있지만 C++ 관점에서는 전혀 다른 관점에서 해석할 필요가 있다. Lvalue와 Rvalue의 구분 C++에서 모든 표현식은 Lvalue 또는 Rvalue이다. Lvalue는 단일 표현식 이후에도 없어지지 않고 지속되는 객체이다. 쉽게 생각해서 이름을 가지는 객체는 Lvalue라고 얘기할 수 있다. 그러므로 const 타입을 포함한 모든 변수는 Lvalue 이다. 반면에 Rvalue는 표현식..

    선 중 후 순회 트리

    #include using namespace std; #define SAFE_DELETE(x) if(x != nullptr) delete x; // 트리 구조체 typedef struct s_tree_node { char data; s_tree_node* p_left; // 왼쪽 노드에 대한 포인터 s_tree_node* p_right; // 오른쪽 노드에 대한 포인터 public: // 전위 순회 함수 static void Pre_order(s_tree_node* _p_root_node) { if (_p_root_node) { printf("%3c", _p_root_node->data); Pre_order(_p_root_node->p_left); Pre_order(_p_root_node->p_right..

    C++ RTTI 그리고 vtable(가상 함수 테이블)

    RTTI 란? Run Time Type Information의 약자로 프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 메커니즘이다. 다시 말하면 실행중 포인터가 가르키는 객체의 타입을 알 수 있게 해주는 하나의 방법이라고 보면 된다. 기본적으로 RTTI가 필요한 이유는 A 타입에서 B 타입으로 변경할 때 정보가 필요하기 때문이다. 컴파일시간에 타입 변환이 이루어진다면 굳이 RTTI가 필요없다. 컴파일 단계에서 충분히 알 수 있고 특정 타입으로 확정할 수 있기 때문이다. 일반적인 상속 관계에서 발생하는 타입 관계는 대부분 컴파일 시간에 해석되나, virtual 클래스로 상속받는 경우에는 컴파일 시간에 추적이 불가능하다. virtual 클래스로부터 상속이 하나라도 존재하면 RTTI를 사용하고 있다고..

    C++ 출력(std::format)과 for-range loop 꿀팁

    C++20에서 아주 재미난 기능이 새로 생겼다, 그것은 C#에서도 봤던(String.Format)과 매우 유사한 메커니즘을 가지고 있는 기능이다 헤더파일 을 필히 추가. #include #include #include #include #include #include using namespace std; int main() { map test_map; int size; cout > size; // 맵에 삽입 for (int i = 0; i > tmp_pair.first.first >> tmp_pair.first.second >> tmp_pair.second; test_map.insert(tmp_pair); } cout

    C++ RVO NRVO 반환값 최적화 / Copy Elision(복사 생략)

    Copy Elision Copy Elision(복사 제거)란 C++11에서 공식화된 기능으로 cppreference의 설명을 참고하면 Omits copy and move constructor, resulting zero-copy pass-by-value semantics 즉 컴파일러가 복사 또는 이동 연산자를 회피 할 수 있으면 회피하는 것을 허용하는 방식 그래서 특정 조건을 만족하면 컴파일러가 임의로 최적화를 위해 복사 및 이동 연산을 생략함. 이게 생각보다 엄청 큰 효과를 가져온다고 하고 크게 두 가지 경우가 있는데 Return Value Optimization(반환값 최적화)인 경우와 class type의 template object(임시 개체)가 동일한 유형의 복사 될 때인 경우다. Return ..

    C++ 가상함수 테이블 (Virtual Table)

    #include using namespace std; class A { public: virtual void Func1() { cout

    Stack (스택) 구현

    #include using namespace std; class MyIntStack { int* p; int size; int tos;public: MyIntStack() {}; MyIntStack(int size); MyIntStack(MyIntStack& s); ~MyIntStack(); bool Push(int n); bool Pop(int& n);}; int main() { MyIntStack a(10); a.Push(10); a.Push(20); MyIntStack b = a; b.Push(30); int n; a.Pop(n); cout size = size;} MyIntStack::MyIntStack(..

    C++ 캐스팅 static_cast / reinterpret_cast 예제

    #include #include #include #include #include #include using namespace std; template T* Cast(F* _ptr) { static_assert(std::is_pointer::value, "포인터가 아님"); void* p_void = _ptr; T* p_casted = static_cast(p_void); if (!p_casted) p_casted = reinterpret_cast(p_void); return p_casted; } class A { protected: int val = 10; public: A() { cout

    C++ SFINAE 여러 타입에 대응하는 템플릿 오버로딩

    #include #include #include #include #include #include using namespace std; template using enable_if_t = typename enable_if::type; template void Run(T& t) { // 정수 타입들을 받는 함수 (int, char, unsigned, etc.) cout

    C++ 콜백 CallBack 함수

    #include #include #include #include #include #include using namespace std; using void_two_params_pointer = std::function; void Function(bool _is_value, int _value) { cout