오늘은 좀 어려운 주제에 대해 논하고자 한다. C++에서 멀티스레드를 구현할 때 C++ 11에서 추가된 std::thread를 사용할 수 있다. thread의 생성자에 void 함수와 함수의 인자를 넣어 멀티스레드 환경에서 프로그램을 동작시킬 수 있다. 하지만 스레드 간에는 명령 순서가 보장되지 않아 예상과는 다른 결과가 나올 수 있다. #include #include #include void increment(int &count) { for (int i = 0; i < 100'000; i++) { count++; } } int main() { int count = 0; std::vector v; for (int i = 0; i < 10; i++) { v.push_back(std::thread(incre..
Programming Languages/C++ Study
범위 기반 for문 (Range based for loop) 범위 기반 for문은 C++11부터 지원하는 표준 C++ 컨테이너의 기능을 포함하는 컨테이너들에 한하여 사용이 가능한 새로운 형태의 for문이다. #include #include #include int main() { std::array arr{ 1, 2, 3 }; std::vector vec{ 4, 5, 6 }; std::cout
오늘 소개할 내용은 RTTI로 Run Time Type Information 즉, 런타임에 객체의 타입을 확인하는 C++의 매커니즘이다. C#에 Type 타입이 있다면 C++에는 std::type_info 타입이 있다. Type과 std::type_info의 차이가 있다면 Type은 컴파일 타임과 런타임 둘 다 확인할 수 있지만 (컴파일 타임에는 클래스의 원형 타입이고 런타임에는 인스턴스의 타입으로 결정된다.) std::type_info는 런타임에만 확인이 가능하다. 또 std::type_info의 기능이 좀 더 적은 편이다. std::type_info는 객체의 원형 타입을 반환한다. 여러 캐스팅을 거친다고 해도 항상 그 객체가 초기에 선언된 타입만을 가리킨다. std::type_info 클래스를 사용하..
C++에는 포인터가 존재한다. 이 포인터 변수를 통해 다른 변수(lvalue)가 가진 값(rvalue)을 참조할 수 있다. 그리고 이 포인터 변수의 앞에 * 연산자를 놓으면 포인터가 참조하는 변수에 역참조할 수 있다. 이 시간에는 연산자 *(Asterisk, 별표)의 사용법을 알아본다. 코드는 언리얼 엔진에서 사용하는 C++ 클래스이다. 1. 포인터 변수의 역참조 연산자 // Mover.cpp void UMover::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); A..
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/crtisvalidheappointer?view=msvc-170 _CrtIsValidHeapPointer Learn more about: _CrtIsValidHeapPointer learn.microsoft.com 마이크로소프트 공식 문서에 따르면 해당 오류는 다음으로 정의된다. _CrtIsValidHeapPointer => 특정 포인터가 어떤 C 런타임 라이브러리(반드시 호출자의 CRT일 필요는 없다)에 의해 할당된 힙에 존재하는지를 확인한다. 도통 무슨 말인지 모르겠지만 런타임 라이브러리 정도는 알아둘 필요가 있다. C 런타임 라이브러리에서 런타임 라이브러리는 컴파일러가 관리하는 프로..