2024/03 10

C++ atomic객체

1. 개요 오늘은 C++ 의 atomic객체에 대해 공부하도록 하겠습니다. 2. Race Condition C++에서 모든 쓰레드들이 전부 랜덤하게 작용합니다. 아래의 코드를 보시겠습니다. #include #include #include #include using namespace std; void worker(int& cnt) { for (int i = 0; i < 10000; i++) { cnt++; } } int main() { int cnt = 0; vector workers; for (int i = 0; i < 4; i++) { workers.push_back(thread(worker, ref(cnt))); } for (int i = 0; i < 4; i++) { workers[i].join()..

카테고리 없음 2024.03.30

VTable 위치 파악

1. 개요 오늘은 가상함수의 필수 가상함수 테이블(Virtual Table)에 위치에 대해 알아보도록하겠습니다. 2. VTable이란? 가상함수 테이블은 클래스 내에서 맴버함수를 virtual 키워드로 지정하면 생성되는 테이블입니다. 특수한 메모리 영역을 활용하여 알맞는 함수를 호출하는데 보통 함수 포인터로 지정이되있습니다. 또한, 가상함수 테이블은 한 객체당 하나의 테이블만 지정이되있으며 함수가 아무리 많아도 한개만 되있습니다. 가상함수 테이블은 OOP의 특징중 다양성을 띄고 있으며 동적 바인딩으로 상속에서 매우 중요한 역할을 합니다. 예전에 올렸던 가상함수 테이블에 대해 링크를 올리겠습니다. https://chogyujin-study.tistory.com/23 C++ Virtual(가상) 함수 오늘은..

메모리 영역

1. 개요 오늘은 메모리 영역의 대해 알아보도록 하겠습니다. 2. 메모리 영역 메모리 영역에는 다음과 같이 나눠져있다. 하지만 자세히 나눠보면 아래와 같이 나눌수있다. RODATA, DATA, BSS는 모두 DATA영역으로 표시하고 다르게 동작을 한다. 1. Text 영역 (code 영역) 우리가 작성한 코드가 컴파일 된후 기계어로 번역되어 저장되어있는 곳이다. 오직 읽기 전용이다. %eip를 통해 읽어서 코드가 실행된다. 프로그램이 끝날때까지 메모리에 남아있다. 전역상수는 여기에 저장된다. 2. Rodata 영역 Rodata는 해석하면 Read only data로, 읽기전용인 data들이 들어간다. 주로 상수, 상수형 문자열, printf의 중괄호 부분이 들어간다. 오직 읽기 전용이다. 3. Data ..

언리얼 엔진 액터의 생명주기(액터 스폰)

1. 개요 오늘은 언리얼 엔진의 엑터 생명주기 액터 스폰으로 시작하겠습니다. 2. 액터 스폰 액터를 스폰(인스턴싱)할 때 따르게 되는 경로입니다. SpawnActor (액터 스폰)이 호출됩니다. PostSpawnInitialize (스폰 초기화 이후)가 호출됩니다. PostActorCreated 액터 생성 이후 - 스폰된 액터의 생성 이후에 호출됩니다. 생성자같은 것이 여기에 와야 합니다. PostActorCreated (액터 생성 이후)는 PostLoad (로드 이후)와 상호 배제적입니다. ExecuteConstruction (생성 실행): OnConstruction 생성시 - 액터의 생성 지점으로, 블루프린트 액터가 컴포넌트를 만들고 블루프린트 변수를 초기화시키는 곳입니다. PostActorConst..

언리얼 엔진 액터의 생명주기(에디터에서 플레이)

1. 개요 오늘은 언리얼 엔진의 엑터 생명주기 에디터에서 플레이 으로 시작하겠습니다. 2. 에디터에서 플레이 에디터에서 플레이 경로는 디스크에서 로드와 거의 똑같지만, 액터를 디스크에서 로드하기 보다는 에디터에서 복사해 옵니다. 에디터에 있는 액터를 새 월드로 복제합니다. PostDuplicate (복제 이후)를 호출합니다. InitializeActorsForPlay (플레이용 액터 초기화) 초기화되지 않은 액터는 RouteActorInitialize (액터 초기화 전달), (심리스 트래블 이전 처리) PreInitializeComponents (컴포넌트 초기화 이전) - 액터의 컴포넌트에서 InitializeComponent (컴포넌트 초기화)가 호출되기 이전에 호출됩니다. InitializeCompo..

언리얼 엔진 액터의 생명주기(디스크 로드)

1. 개요 오늘은 언리얼 엔진의 엑터 생명주기 디스크 로드편으로 시작하겠습니다. 2. 액터의 생명주기 액터란 실제로 레벨에 직접 물체를 불러들일수있는것중 하나입니다. 보통 액터를 생성할때 직접 레벨에 끌어다가 생성을 할수 있고, 아니면 코드로 SpawnActor를 통해 생성이 가능합니다. 아래의 사진은 액터의 생명주기 그림입니다. 3. 디스크 로드 디스크 로드는 이미 레벨에 있는 액터에 대해서, LoadMap이 발생했을 때나 AddToWorld가 호출되었을 때 발생합니다. 패키지/레벨에 있는 액터가 디스크에서 로드 PostLoad로드 이후 - 디스크에서의 로드 완료 후 Serialize(직렬화) 된 액터의 의해 호출됩니다. 커스텀 버전이나 픽스 작업은 이 곳에 와야 합니다. PostLoad 는 PostA..

RTTI vs Reflection

1. 개요 오늘은 RTTI vs Reflection 에대해서 알아보도록 하겠습니다. 2. RTTI RTTI 는 Run Time Type Information 의 약자로 C++에 핵심 기술입니다. 보통 virtual 함수를 통해 실행시간에 클래스의 정보를 가져오는 역할을 합니다. 실행시간에 정보를 가져온다는 점이 특징이며, RTTI는 객체의 정보 및 함수 오버라이딩을 할수있어 다양성 성격을 띄우지만 변수를 가져오지 못합니다. https://chogyujin-study.tistory.com/25 C++ RTTI 에 대해 오늘은 RTTI에 대해 공부하겠습니다. RTTI란? Run Time Type Information의 약자로 프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 매커니즘입니다. 다시 말해..

초기화자 리스트(intializer_list)

1. 개요 오늘은 초기화자 리스트(Initializer_list)에 대해서 공부하도록 하겠습니다. 2. 초기화자 리스트란? 초기화자 리스트란 중괄호를 사용해서 배열 및 벡터를 초기화할때 많이 사용하는 방식입니다. int arr[] = {1, 2, 3, 4}; 이러한 코드를 많이 보셨을거라 판단됩니다. 그렇다면 아래의 코드는 과연 가능할까요? vector v = {1, 2, 3, 4}; 물론 가능합니다. C++11부터 사용자에게도 이러한 문법을 사용할수 있도록 하게 하였습니다. #include class A { public: A(std::initializer_list l) { for (auto itr = l.begin(); itr != l.end(); ++itr) { std::cout