프로그래밍 언어

    C++ 구조적 바인딩 (Structured Bindings)

    C++17부터 지원하는 structured binding이란 어떤 배열, STL 같은 컨테이너에서 멤버들을 쉽게 바인딩할 수 있도록 도와주는 문법이다. 친숙한 std::map을 예시로 바인딩을 해보자. #include #include int main() { std::map mp; for (int i = 1; i < 11; i++) { mp[i] = i * i; } // iterator, basic for for (std::map::iterator it = mp.begin(); it != mp.end(); it++) { std::cout first

    C++ STL 설명과 for-range 기반 loop

    STL(Standard Template Library)은 C++ 내 템플릿 클래스들의 집합이며, 개발자에게 도움줄 수많은 자료구조와 함수들이 구현 되어있다. 기본 4가지로 구성 되어있다. 알고리즘 헤더 파일 내 (정렬, 탐색 컨테이너 (선형,비선형 자료구조) 예) , 함수 이터레이터 (반복자) 모든 컨테이너들은 이를 지원하지 않음. STL은 기본적으로 범위 기반 for문을 돌려 원소에 접근할 수가 있다. 핵심은 4번에 있다, 이를 실행할 수 있는 조건이 바로 .begin() 함수다 즉 첫 원소의 주소를 이터레이터 형태로 반환하는 함수다. 예) for(auto item : 컨테이너 이름) 여기서 한 가지 의문점이 들 수도 있는데 const auto : const auto& : auto : auto& : 위..

    C# Boxing Unboxing 박싱 언박싱 값>참조, 참조>값

    Boxing ( 박싱 ) : 값 형식을 참조 형식으로 변환하는 것을 말한다. boxing은 암시적으로 발생한다. ( 예를 들어 int, float 를 object 로 변환하는 것을 말하는데 이 과정에서 단순 참조의 20배에 해당 하는 오버헤드와 메모리의 추가 사용이 발생한다. ) int test = 100; object tetsObj = test; UnBoxing ( 언박싱 ) : 참조 형식을 값 형식으로 변환하는 것을 말한다. Unboxing은 명시적으로 발생한다. ( 예를 들어 object를 int, float로 변환하는 것을 말하는데 이 과정에서 일반적인 할당의 4배에 달하는 시간이 소요된다. ) int test = 100; object testObj = test; int i = (int)test;..

    C++ 예외 처리용 throw(), noexcept()

    throw(typeid, typeid, ...) throw 한정자는 함수가 예외로 던질 수 있는 typeid의 목록을 인자로 받는다. typeid에 해당하는 타입이 클래스나 구조체라면, 상속받는 자식도 역시 예외를 던질 수 있는 타입으로 간주한다. // 아무 타입도 지정하지 않았으므로, 예외를 던지지 않는다. void no_except() throw(); // 모든 타입에 대해 예외를 던진다 void bar() throw(...) {}; // C++11부터 추가된 parameter pack, 즉 C++11 이전엔 이 형태가 불가능 void baz() {}; class X {}; class Y {}; class Z : public X {}; class W {}; // 함수 f는 X와 Y, 그리고 그들의 자..

    C++ 전방 선언 (Forward Declaration)

    외부 파일 어딘가에 해당 클래스가 존재한다고 알려주는 역할 다양한 파일들을 만들고 서로 엮는 과정에서 불필요한 파일의 정보까지 가져오는 상황이 발생한다. 이를 해결하기 위해서 전방 선언을 사용하는 것이 좋다. #include와 전방 선언의 차이점 #include 기존에 존재하는 정보를 확인할 수 있다. 전방 선언 어딘가에 존재한다는 것을 알 수 있지만 상세한 정보는 알 수 없다. 전방 선언의 장점 #1. 파일의 크기가 작아진다.(컴파일 속도의 향상) 전방 선언 시 주의 사항 #1. 존재만 알려준다. 프로그램에서 전방 선언한 것이 존재하는지 검사를 하지 않는다. 오타가 발생할 경우 찾기 힘들다. #2. 존재만 알기 때문에 객체를 만들 수 없다. 왜냐하면 정확한 크기를 알지 못해서이기 때문이다, 포인터 변수..

    C++ typename의 두 가지 의미

    템플릿의 타입 매개변수를 선언할 떄는 class와 typename의 뜻이 완전히 똑같다. 그렇다고 언제까지나 class와 typename이 C++ 앞에서 언제나 동등한 것만은 아니다. template void Print2nd( const C& container) { if( container.size() >= 2 ) { C::const_iterator iter( container.begin() ); ++iter; int value = *iter; std::cout void Print2nd( const C& container ) { C::const_iterator* x; ... } 언뜻 보면, C::const_iterator에 대한 포인터인 지역 변수로서 x를 선언하고 있는 것 같지..

    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는 표현식..

    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 ..