본문 바로가기

전체 글142

Effective C++ chapter 6 2015. 5. 6.
Modern Effective C++ item 27 : Universal Reference 오버로딩의 대안들 Universal Reference 오버로딩의 대안들item 26에서 universal reference를 오버로딩하는 것의 문제점에 대해서 이야기했다. 하지만 universal 오버로딩 방식의 장점도 분명하다. 이 장에서는 그런 상황에 처했을때, 어떻게 곁가지 문제들을 회피하면서 원하는 기능을 수행할 수 있는지를 이야기 할 것이다.오버로딩 금지item 26의 logAndAdd 예시를 생각해보자. universal reference의 강력한 포용력(?)때문에 다른 오버로딩들이 씹혀버리는 불상사가 발생하였다. 그렇다면 그냥 오버로딩을 포기하는게 속편할 수 있다. logAndAddName 과 logAndAddNameIdx 같은 느낌의 이름으로 바꾸면 일차적으로 해결은 된다. 그런데 생성자는 어떻게 이름을 바.. 2015. 5. 6.
멀티쓰레드 서버 버그잡기 멀티 쓰레드 버그잡기 1. LockOrderCheckervoid LockOrderChecker::Pop(FastSpinlock* lock) { /// 최소한 락이 잡혀 있는 상태여야 할 것이고 CRASH_ASSERT(mStackTopPos > 0); /// 당연히 최근에 push했던 녀석이랑 같아야겠지.. CRASH_ASSERT(mLockStack[mStackTopPos - 1] == lock); mLockStack[--mStackTopPos] = nullptr; } 버그 메시지는 여기서부터 시작한다. Lock Stack의 top과 pop할 대상 lock이 다르다! 이 스택은 LockOrderChecker에서 LockHierachy 유지를 위해서 사용하던 스택이다. 스택하면 생각나는 버그는 ABA이다. .. 2015. 5. 4.
Modern Effective C++ item 25 : std::move / std::forward 를 적재적소에 사용하자. std::move / std::forward 를 적재적소에 사용하자.item 23,24에서 이야기한 것처럼, std::move는 인자를 무조건적으로 rvalue reference로 캐스팅하고, std::forward는 인자가 rvalue인지 체크해서 조건부로 rvalue reference로 변경한다. 여기서 주의해야할 사항이 있다. universial Reference에는 std::move를 사용해선 안되고, rvalue reference에는 std::forward를 사용해선 안된다. 전자는 정말 위험하다.universial Reference에 std::move를 쓰지말자.class Widget{ public: template void setName(T&& newName) //T&&는 universial.. 2015. 4. 28.