| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- resource management class
- 영화 리뷰
- 반복자
- 티스토리챌린지
- reference
- 오블완
- lua
- 영화
- implicit conversion
- Smart Pointer
- 언리얼
- 암시적 변환
- 상속
- effective stl
- std::async
- exception
- universal reference
- Effective c++
- 스마트 포인터
- c++
- virtual function
- 보편 참조
- 참조자
- UE4
- iterator
- effective modern c++
- 예외
- more effective c++
- 게임
- operator new
- Today
- Total
목록전체 글 (242)
스토리텔링 개발자
영화에 앞서, 종이를 먼저 말해볼까 한다. 종이. 아무래도 취미가 취미인지라 가장 먼저 떠오르는 건 기록적인 요소이다. 질 좋은 종이, 그리고 그걸 아름답게 감싸고 있는 공책이나 수첩들은 어린 시절부터 나에게 많은 영감을 주는 아이템이었다. 여기에 뒤이어 떠오르는 건, 뭐랄까, 약간의 고리타분함? 아무래도 이제 와서 종이는 고전적으로 사용되던 그 용도의 최전방에서는 살짝 뒤로 물러난 느낌이 없잖아 있다. 우선 책에서부터 그렇다. 나부터가 무조건 종이책, 을 고수하던 것이 벌써 어언 옛날이 되어버릴 정도로 어느새 꽤 많은 지분이 ebook으로 대체되었다. 기록? 번거롭게 종이뭉치 수첩을 들고 다닐 필요도 없이 늘 손에 잡히는 스마트폰이 그 쓰임새를 대신하고 있다. 이렇게 적어나가고 있자니, '약..
항목 42. 삽입 대신 생성 삽입을 고려하라 std::vector에 요소 삽입삽입 함수로 넣는 요소의 타입이 늘 std::string인 것은 아니다.std::vector vs;vs.push_back("xyzzy"); // 문자열 리터널을 삽입한다.std::vector의 push_back은 lValue와 rValue에 대해 오버로딩 되어 있다.template>class vector{public: ... void push_back(const T& x); // lValue 버전 void push_back(T&& x); // rValue 버전 ...};컴파일러는 const char[6]과 std::string이 불일치함을 인식한다.이를 해소하기 위해 컴파일러는 문자열 리터럴로 임시 st..
항목 41. 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라 복사되도록 만들어진 함수 매개변수class Widget{public: // 이 버전은 복사되도록 만들어졌다. void addName(const std::String& newName) // lValue { names.push_back(newName); // 복사 } // 이동 버전 void addName(std::string&& newName) // rValue { names.push_back(std::move(newName)); // 이동 } ... private: std::vector names;};이 경우 본질적으로..
항목 40. 동시성에는 std::atomic을 사용하고, volatile은 특별한 메모리에 사용하라 volatile사실 동시적 프로그래밍과는 무관하다.하지만 다른 언어에서는 volatile이 동시적 프로그램에 유용하다.C++에서도 일부 컴파일러는 동시적 소프트웨어에 적용할 수 있을 수도 있다.volatile은 다중 스레드에서 거의 아무것도 보장하지 않는다!volatile int vi(0);vi = 10;std::cout 위 코드를 실행하는 동안 다른 스레드들은 vi의 값을 0, 10, 11만 본다고 보장할 수 없다.이처럼 writer와 reader가 동시에 접근하려고 하면 자료 경쟁(data race)이 발생할 수 있다.C++에서는 std::atomic를 사용해야 한다. std::atomic다른 ..
항목 39. 단발성 이벤트 통신에는 void future 객체를 고려하라 스레드 간 통신을 처리하는 방법 특정 이벤트를 감지하여 브로드캐스팅 하는 task가 유용할 때가 있다.자료구조의 초기화계산 과정 중 특정 단계의 완료 등.이런 통신은 어떻게 처리해야 할까? 조건 변수(condition variable, condvar)조건 변수를 사용하여 해결해 본다.검출 task(detecting task)조건을 검출하는 task반응 task(reacting task)조건에 반응하는 task반응 task는 하나의 조건 변수를 기다리고,검출 task는 사건이 발생하면 그 조건 변수를 노티한다.std::condition_variable cv; // 이벤트를 위한 조건 변수std::mutex m; // cv와 함..
항목 38. 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라 시스템 스레드의 핸들(handle) 종류joinable(합류 가능) std::thread지연되지 않은 task(항목 35 참조)의 future 객체허나 이 둘의 소멸자는 아주 다르게 동작한다. joinable std::thread의 소멸자프로그램이 종료된다.(항목 37 참조) future 객체의 소멸자상황에 따라 암묵적 join, 암묵적 detach로 동작한다.허나 프로그램이 종료되는 일은 없다. future 객체의 행동 방식future 객체는 호출한 쪽에서 피호출자의 값을 읽기 위해 사용하는 채널이다.피호출자는 (보통은 비동기적으로) 계산하여 그 결과를 통신 채널에 기록한다.(보통은 std::promise)호출자는 future..
항목 37. std::thread들을 모든 경로에서 합류 불가능(unjoinable)하게 만들어라 합류 가능(joinable) std::thread현재 실행중이거나 실행중 상태로 전이할 수 있는 스레드이에 대응하는 객체차단된 상태인 std::thread실행 일정을 기다리는 중인 std::thread실행 완료된 std::thread 합류 불가능(unjoinable) std::thread합류할 수 없는 스레드이에 대응하는 객체기본 생성된 std::thread실행할 함수가 없기 때문이다.다른 std::thread 객체로 이동된 후의 std::thread바탕 스레드가 다른 std::thread의 바탕 스레드가 된다.join에 의해 합류된 std::threadjoin 이후의 std::thread 객체는 실..
항목 36. 비동기성이 필수일 때에는 std::launch::async를 지정하라 std::async 호출함수를 비동기적으로 실행하겠다는 의미하지만 늘 그런 의미일 필요는 없다.함수를 어떤 시동 방침(launch policy)에 따라 실행한다는 의미도 가진다. 표준이 제공하는 시동 방침std::launch 라는 enum으로 제공된다.std::launch::asyncf는 반드시 비동기적으로(다른 스레드에서) 실행된다.std::launch::deferredf는 std::async가 리턴한 future 객체에 대해 get이나 wait가 호출될 때까지 실행이 지연된다.std::async의 기본 방침은 위 두 가지를 or로 결합한 것이다.결과적으로 기본 방침으로는 함수의 실행이 비동기일수도 동기일수도 있다...