전체 글
[C++] placement new 객체 태그 만들기
[C++] placement new 객체 태그 만들기
2025.06.09큰 버퍼를 미리 할당하고 placement new를 사용하는 경우가 있습니다.기본적으로, placment new 에 전달되는 주소는 객체의 필드가 캐시라인에 걸치지 않게 해야합니다.이래야 atomic / SIMD 연산시 torn access 가 발생하지 않습니다. 구현 해 볼 것은 다음과 같은 사항을 만족하는 클래스 디자인 입니다. 1. 버퍼를 참조하는 객체가 없어질 때까지 버퍼는 유효해야합니다. 2. 객체의 delete 호출시 메모리가 해제 되어서는 안됩니다. 3. 객체의 소멸자가 먼저 호출 되고, 버퍼의 참조를 해제해야 합니다. 템플릿을 이용해서 구성하면 간단하게 구현이 가능합니다.template class Placed;class PlacedTag{ template friend class Place..
[C++] std::apply 구현해보기
[C++] std::apply 구현해보기
2025.06.05std::tuple은 생성시 variadic 인수를 지원합니다.따라서 개수와 타입이 정해지지 않은 원소들을 담아둘 수 있습니다.이러한 특성으로 functor를 만들때 자주 사용됩니다.이때, 튜플의 각 원소들을 함수의 인수로 전달할때 std::apply가 사용됩니다.이것을 구현해 보겠습니다. 우선 전역 함수를 하나 만들겠습니다. templatedecltype(auto) MyApply(Fp&& fp, VdTuple&& tpl){} 반환형을 auto로 준 이유는 Fp로 들어오는 함수가 어떤 반환형을 가져도 상관이 없게 만들 것 이기 때문입니다.이제 내부의 구현을 해야합니다. 자 그럼 여기서 이해를 돕기 위해서 예시를 하나 들겠습니다.직접 하나씩 구현을 한다면 어떻게 될까요? 가령, 이런 함수가 있다고 한다면,..
[C++] functor 만들기
[C++] functor 만들기
2025.06.04프로그램을 작성하다보면, 동적인 시점에 작업 자체를 생성 하고 싶은 경우가 생깁니다.상태를 확인하고 분기하도록 작성된 코드가 컴파일 된 상황이 아닌 상황.이벤트내지는 태스크라고 생각하시면 이해가 쉬울 것 입니다.당연히 객체로 구현할 수 있어야 합니다.그래야 다른 스레드로 그것을 던져 줄 수 있을 것이고,처리 시점을 임의로 정할 수도 있을 것 입니다. 실행할 함수의 시그니처가 어떻던 간에, 추상화 할 수 있어야 합니다.그래서 인터페이스를 하나 만듭니다.//이 타입으로 추상화 하기로 합니다.class MyFunctor{protected: MyFunctor() {} virtual ~MyFunctor() {}; //하위 클래스에서 재정의, 각각의 함수와 인자를 사용해서 분기 virtual void Dispatc..
[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는 템플릿을 통한 호출을 하기 때문에 함수의 시그..