[NDC 2016] 테라 서버의 Modern C++ 활용기

mohadang·2023년 8월 27일
0

summary

목록 보기
1/2
post-thumbnail

shared_ptr의 Refrence Count 연산은 비쌀 수 있다

  • Atomic 연산
  • Atomic Increment/Decrement 연산은 (생각보다) 비싸다.
  • 스마트포인터의 의미없는 복사가 발생하는 경우가 많다.
  • Vector
    • Reallocation에서 RefCount++/RefCount-- 발생
    • 최신 C++에서 문제가 개선 되었더라도 여전히 어디선가 Atomic 연산이 발생할 수 있다.

소유권 이전

  • 사라질 객체는 소유권을 위임하는 것으로 충분.
  • 소유권을 위임 함으로서 Refrence를 늘리거나 줄이는 작업을 할 필요 없음.
  • Vector에 RValue 사용하면 Move Constructor 호출 ?
    • Nop ! Lavlue로 받게됨.
    • Perfect Forwarding을 하도록 수정하면 문제 해결 가능
      • Universal Refrence

Cppcon20215 - Writing Good C++14

  • 스트롭스트룹
    • shared_ptr이 지나치게 남용
    • shared_ptr을 파라미터, 리턴으로 많이 사용
    • Dangling Pointer는 룰을 잘 따르고 룰을 이용하면 다 잡을 수 있다
    • Rules for Eliminationg Dangling Pointers
      • Owner와 Non-Owner 구분.
      • Raw-Pointer는 모두 Non-Owner.
      • Pointer가 Owner의 Scope를 벗어나려하는 시도를 모두 잡는다.
        • Parameter로 받아서 Return으로 돌려주는 건 괜찮음.
      • Ownere를 가지고 있는 객체는 Owner다.
        • vector<T*>

Variadic Template

  • 임의의 인자 개수를 지원하는 템플릿 형식(클래스, 함수 보두 지원).
  • 적절히 활용하면 가독성을 높일 수 있다.
template<typename... Args>
void DoFunc(Args... args) {
  Func(args...);
}

sizeof...(Args)

Base(base)... {}

std::tuple은 템플릿으로 만들어져 있다

  • 튜플은 정적 타입이다 !.
  • integer_sequence.
    • 튜플을 매개 변수로 사용 가능.
    • sequence 이용해서 tuple 순회 가능
    • Ellipsis Operator의 활용
  • 컴파일 하면 다음과 같은 추론 문제 발생 가능

콜스택 줄이기

  • 과거엔 this의 타입을 추론하기 위해서 *_impl 함수 만듬.
  • 지금은 decltype 사용 가능.

Future-Promise

  • async, future, promise, packaged_task, thread...
  • promise, future
    • 미래라는 관념을 실체화 할 수 있다.
  • async
    • std::launch::async : 호출시 비동기로 실행(다른 쓰레드에서 실행 되는 것이 보장).
    • std::launch::deferred : 나중에 값을 필요로 할 떄 실행. Lazy Evaluation.
  • future 패턴은 어디에 ?
    • 콜백 지옥을 벗어나고 싶을때
    • 싱글 쓰레드 로직 중간에 분산처리를 넣고 싶을때.
  • async 분산 작업

성능 측정 툴

  • 윈도우 퍼포먼스 모니터.
  • Visual Studio vTune.

Link

profile
mohadang

0개의 댓글