C++ 32

컴파일 타임에 타입을 모르는 경우(C++)

1. 다형성과 상속 객체 지향 프로그래밍에서 하나의 기본 클래스 포인터가 다양한 파생 클래스의 인스턴스를 가리킬 수 있습니다. 이 경우, 컴파일 타임에는 실제로 어떤 파생 클래스의 인스턴스가 해당 포인터를 통해 참조될지 알 수 없습니다. 런타임에 특정 조건에 따라 다른 파생 클래스의 인스턴스가 생성되어 할당될 수 있기 때문입니다. 2. 객체 직렬화와 동적 객체 생성 애플리케이션에서 객체의 상태를 파일이나 네트워크를 통해 저장하고, 나중에 이를 다시 불러올 때 객체 직렬화가 사용됩니다. 직렬화 과정에서 객체의 타입 정보도 함께 저장되어야 하며, 나중에 이 정보를 사용하여 원본 객체와 동일한 타입의 객체를 동적으로 생성해야 합니다. 이 과정에서 런타임에 타입 정보를 확인하고 객체를 생성하는 메커니즘이 필요합..

C++ 2024.04.08

""과 L""과 _T("")의 구분

"" : 멀티바이트일 경우에는 해당 표기를 이용. L"" : 유니코드를 사용하는 문자의 경우에는 해당 표기를 이용. _T("") 와 TEXT("") : 유니코드일 때는 L""로, 멀티바이트 일때는 ""로 자동치환 되어 컴파일이 가능하도록 하는 표기. 각각의 표기는 멀티바이트와 유니코드에서 문자처리를 돕기 위한 것으로, 되도록 _T("") 와 TEXT("")를 사용하여 멀티바이트와 유니코드의 구분에 영향받지않고 자동변환되도록 하는 것이 좋다.

C++ 2024.02.20

__stdcall과 __cdecl

__cdecl에 대한 마소의 설명문 __cdecl은 C 및 C++ 프로그램의 기본 호출 규칙입니다. 스택은 호출자에 의해 정리되므로 vararg 기능을 수행할 수 있습니다. __cdecl 호출 규칙은 각 함수 호출에 스택 정리 코드를 포함해야 하기 때문에 __stdcall보다 더 큰 실행 파일을 생성합니다. 다음 목록은 이 호출 규칙의 구현을 보여줍니다. __cdecl 수정자는 Microsoft에만 적용됩니다. 변수나 함수 이름 앞에 __cdecl 수식자를 붙입니다. C 명명 규칙과 호출 규칙이 기본이므로 x86 코드에서 __cdecl을 사용해야 하는 경우는 /Gv(vectorcall), /Gz(stdcall) 또는 /Gr(fastcall) 컴파일러 옵션을 지정한 경우뿐입니다. /Gd 컴파일러 옵션은 _..

C++ 2024.01.26

객체 지향(OOP)

객체 지향 프로그래밍의 여러가지 이점이 있다. 가장 큰 이점은 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다는 것. 객체 지향은 코드 변경을 최소화하고 유지보수를 하는데 유리하다. 객체는 자동차와 같은 하나의 객체를 추상화 시켜 속성과 기능으로 분류하고 이것을 변수와 함수로 정의한다. 객체지향의 4가지 특징. 1. 추상화 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현. 어떤 객체가 수행해야하는 핵심적인 역할만을 규정해두고, 실제 구현은 해당 인터페이스를 구현하는 각각의 하위 클래스에서 하도록 설계하는 것. 이렇게 함으로써 자동차와 오토바이의 전진이 다른 방식으로 움직이듯이 다른 형태의 구현을 가능하도록하고 코드간의 직접적인 결합도를 낮추게 할 수 있다. 아래는 ..

C++ 2023.10.02

Lambda(람다)

람다의 구성 람다는 위 그림과 같이 4 개의 부분으로 구성되어 있다. 그 4 개의 부분은 각각 개시자 (introducer), 인자(parameters), 반환 타입 (return type), 그리고 함수의 몸통 (statement) 라 한다. 일단, 람다 맨 처음에 나타나는 [] 는 개시자로, 그 안에 어떤 외부 변수를 써 넣는다면 람다 함수가 이를 캡쳐 해서, 이 변수를 람다 내부에서 이용할 수 있게 된다. 위 경우 my_mod 라는 변수를 람다 내부에서 이용할 수 있게 된다. 그 다음의 () 는 람다가 실행시 받을 인자들을 써 넣는다. 위 람다는 int 형의 v_ 를 인자로 받는다. 여기는 그냥 실제로 함수에서 사용하는 인자 리스트와 동일하게 적어주면 된다. 이제, 그 옆으로 보면 -> 가 있고 반..

C++ 2023.10.01

좌측값(lvalue) & 우측값(rvalue)

좌측값은 어떠한 메모리 위치를 가리키는데 &연산자를 통해 그 위치를 참조할 수 있다. 우측값은 좌측값이 아닌 값들이다. 우측값 참조라 정의한 것들도 좌측값 혹은 우측값이 될 수 있다. 이를 판단하는 기준은 만일 이름이 있다면 좌측값, 없다면 우측값이다. 우측값 레퍼런스 참조: https://modoocode.com/189 씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해 함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할 modoocode.com

C++ 2023.10.01

Condition_Variable(조건 변수)

다른 스레드가 공유 변수를 수정하고 Condition_Variable로 통지할 때까지 스레드나 여러 스레드를 대기하도록 하는데 사용할 수 있는 동기화 기법 C++의 조건 변수(Condition Variable)는 멀티스레딩 환경에서 스레드 간 동기화와 통신을 위한 중요한 도구 중 하나다. 조건 변수는 C++의 표준 라이브러리인 `` 헤더에서 제공된다. 조건 변수는 주로 다음과 같은 상황에서 사용된다: 1. 스레드 대기(Waiting): 하나 이상의 스레드가 특정 조건이 충족될 때까지 대기하도록 만든다. 이 조건은 다른 스레드가 어떤 작업을 마치고 조건 변수를 통해 대기 중인 스레드에게 신호를 보낼 때까지 대기한다. 2. 스레드 깨우기(Notify): 조건이 충족되었을 때, 다른 스레드에게 대기 중인 스레..

C++ 2023.09.30

RAII(Resource Acguisition Is Initialization)

SBRM(Scope Bound Resource Management)이 RAII의 다른 이름: 핵심 개념은 파괴인데 이름이 초기화라 다른 이름이 생김 자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해 주는 기법ex) std::unique_ptr, lock_guard 의 개념이 여기에 해당 C++에서 heap에 할당된 자원은 명시적으로 해제하지 않으면 해제되지 않지만, stack에 할당된 자원은 자신의 Scope가 끝나면 메모리가 해제되며, 소멸자가 불리는 원리를 이용-> 자원 관리를 스택에 할당한 객체를 통해 수행 예시)스마트 포인터는 소유하는 메모리의 할당 및 삭제를 처리한다. 스마트 포인터를 사용하면 클래스에서 명시적 소멸자를 widget 사용할 필요가 없다.#include cl..

C++ 2023.09.30