전체 글
[C++] std::move 와 std::forward
[C++] std::move 와 std::forward
2022.04.09언제 std::move를 사용해야 하는지, 언제 std::forward를 사용해야 하는지 알아보는 시간을 가져보도록 하겠습니다. 1. std::move std::move의 경우 형변환 작업을 수행합니다. 받은 param에 대해 R-value reference를 반환합니다.예를 들면 이런 식 입니다. #include void Function(int&& Arg) { std::cout
[C++] STL Custom Allocator 사용
[C++] STL Custom Allocator 사용
2022.04.08Custom Allocator를 사용해서 STL Container들이 사용할 버퍼를 공급할 수 있습니다. STL Cotainer는 Element가 들어갈 Container Buffer의 할당시 템플릿으로 구현된 Allocator 클래스를 사용합니다. STL에서의 할당 동작시의 힙 파편화가 우려되는 상황이라면, 커스텀된 Allocator 클래스를 우리가 직접 구현하고, 미리 구현해둔 메모리풀로 이어지게 해서 통제할 수 있습니다. 우선 STL Cotainer의 할당시 동작의 이해를 위해서 아주 간단한 allocator 클래스를 구현하겠습니다. 할당시 동작할 내부 구현을 바꿔서 프로젝트 상황에 맞게 사용하시면 되겠습니다. 물론 말씀드렸듯이 STL Cotainer는 템플릿을 통한 호출을 하기 때문에 함수의 시그..
캐시메모리와 Cache Friendly Code
캐시메모리와 Cache Friendly Code
2022.04.031. 캐시메모리는 무엇인가? 캐시메모리의 핵심 개념은 locality이다. 레지스터에 가까운 지역에 전진기지를 만들어 그 안에 자주 사용하고(temporal locality), 인접한(spartial locality) 데이터를 보관하기 위해 고안되었다. 잘 알려져 있듯이 메인메모리보다 크기가 작다. 이 작은 꾸러미를 최대한 활용하기 위한 하드웨어 알고리즘은 지금도 개발되고 있다. 허나 이것은 어디까지나 한계가 있는 이야기이다. 전 지구상에서 지금도 개발되고 있는 모든 어플리케이션의 분기를 예측하는 것은 불가능에 가깝기 때문이다. 따라서 개발자 또한 어느정도는 캐시메모리를 이해하고 코드를 짜는 것이 최적화에 매우 유리하다고 할 수 있다. 찾는 데이터가 캐시메모리에 보관되어 있다면, 캐시 히트 라고 한다. ..
멀티스레드 환경에서의 캐시 라인에 대한 주의사항
멀티스레드 환경에서의 캐시 라인에 대한 주의사항
2022.04.02OS는 프로세서의 정보를 얻을 수 있는 API를 제공한다. 윈도우즈의 경우 다음과 같이 작성해보자. #include #include int main() { SYSTEM_LOGICAL_PROCESSOR_INFORMATION* pInfo = nullptr; unsigned long length = 0; GetLogicalProcessorInformation(nullptr, &length); pInfo = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION*)malloc(length); GetLogicalProcessorInformation(pInfo, &length); //OS가 알려주는 length는 SYSTEM_LOGICAL_PROCESSOR_INFORMATION의 크기 * N이다. //..
[C++] C++ 11 mutable
[C++] C++ 11 mutable
2022.03.28C++11 에 mutable keyword가 추가 되었다. 아래의 간단한 코드를 보도록 하자. 너무 간단하다. #include class Entity { private: int A = 10; mutable int B = 20; int C = 30; public: Entity() {} virtual ~Entity() {} void Function() const { //A = 20; //컴파일 에러 함수 선언에 const가 붙었다. B = 30; //Okay. //B에는 mutable 키워드가 붙었음으로 const가 붙은 함수에서도 B값에 대한 수정이 허용된다. } }; mutable은 멤버 변수 혹은 람다에서 사용이 가능하다. int main() { mutable int A = 10; //무의미하다. //..