c++11
-
C++11 람다를 보다 깔끔하게 쓰는 방법프로그래밍/c++ 2015. 9. 19. 22:45
1234567891011 // 비동기 송신을 등록합니다. socket.async_send(buffer(sendChunk, sendBytes), strand.wrap( [this, buffer = std::move(sendBuffer)](const auto& error, size_t bytes) // 람다 {// 완료 함수 if (error) {// 오류를 알린다. this->on_error(error); } } // 람다 끝 ));Colored by Color Scriptercs Vs2015에서 람다를 써서 비동기 핸들러를 설정하는데 코드가 지저분하게 느껴졌다. {}과()이 겹쳐지면서 어디까지가 무슨 코드고 이런 거 구분이 뚜렷하지가 않게 느껴지더라.어떻게하면 보다 깔끔하게 보일까를 생각했는데 람다를 변..
-
[c++11] std::weak_ptr의 사용프로그래밍/c++ 2015. 7. 23. 12:30
weak_ptr약한 포인터(weak pointer)에 관한 설명으로 흔히 사용되는 말은 shared_ptr로 연결된 자료구조의 포인터 참조 고리를 끊기 위해서라는 것이다. 나는 weak_ptr를 다음과 같이 설명하는 편이 더 나을 것이라고 생각한다.포인터가 존재할 경우에만 참조해야 하고(다른 누군가에 의해) 삭제될 수 있으며마지막으로 사용된 후에는 소멸자가 호출되어야 하는(그래서 자신이 할당했던 익명 메모리 공간을 제거해야만 하는) 포인터고전 게임인 "행성 게임(asteroid game)"을 구현해야 한다고 생각해 보자. 모든 행성은 게임에 의해 관리되지만 행성 사이의 충돌을 처리하기 위해서 이웃 행성 정보도 관리해야 한다. 행성이 충돌하면 보통 하나 이상의 행성이 소멸된다. 이러한 이웃 행성 목록을 관..
-
asio udp client 작업 중 람다 캡처를 잘못 사용한 문제프로그래밍/의문 2015. 7. 14. 18:51
123456789101112131415161718void UdpClient::Send(const ip::udp::endpoint& endpoint, const void* source, size_t bytes){ std::vector sendBuffer; sendBuffer.resize(bytes); std::memcpy(sendBuffer.data(), source, bytes); socket.async_send_to( buffer(sendBuffer.data(), sendBuffer.size()), // send data endpoint, [this, buf = std::move(sendBuffer)](const boost::system::error_code& error, size_t bytes){ /..
-
c++11에 추가된 override 키워드와 필요성프로그래밍/c++ 2015. 7. 13. 00:13
Session을 상속받는 MySession이라는 클래스가 있다고 하자. MySession 클래스는 Session의 OnReceive 함수를 재정의 하려고 했다. 1234567class MySession : public Session{public: virtual void OnReceive() { }};cs 하지만 Session의 OnReceive의 정의는 이와 달랐다. 1234567class Session{public: virtual void OnReceive(const void* buffer, size_t bytes) { }};Colored by Color Scriptercs 이 경우 OnReceive는 Session의 OnReceive 재정의가 아닌, MySession 클래스에서 새롭게 정의된 가상함수..
-
우측값 참조로 받은 값은 우측값일까?프로그래밍/c++ 2015. 3. 25. 17:12
우측값 참조로 받은 값은 우측값일까?나는 우측값을 처음 사용했을 때 우측값으로 받았으니 당연히 우측값이겠지! 라고 생각했었다. 마치 래퍼런스처럼 -_-;하지만 전혀 그렇지 않았다.왜 그럴까 자료를 찾아보던 중 이런 문구를 발견했다. "우측값 참조를 설계한 사람들은 우측값 참조라 정의한 것들도 좌측값, 우측값이 될 수 있다고 했다." 이 뭔 x소리야??란 생각이 들었는데, 상황은 다음과 같다 1234567c.push_back(std::string("Hello!")); // it's right value! void c::push_back(std::string&& str) // it's left value{ ...} 위 c.push_back(...)은 우측값이고, 아래의 c::push_back(... str)..
-
C++ 오브젝트 생성시 {}와 () =의 구분프로그래밍/c++ 2015. 2. 2. 00:07
C++11에서의 초기화 방법들은 다음과 같은것이 있다. int a = 0;int a(0);int a{0}; 여기에서 int a = { 0 } 이와 같은 문법은 {}만 같이 쓴거처럼 처리된다. 즉, int a = {0} == int a{0} {}는 C++11부터의 초기화 문법으로, {}를 사용하는 초기화를 유니폼 초기화(uniform initialization)라고 한다. * 모든 non static value의 초기화는 {}를 이용해서 가능하다 class widget{ int a(0); // error int b{0}; // ok int c = 0; // ok }; * 복사가 안 되는 오브젝트에 대해서는 ()는 되지만 =는 안 된다. std::atomic a{0}; // okstd::atomic b(0)..
-
[c++] c++11에 추가된 표준 뮤텍스(mutex)프로그래밍 2014. 7. 14. 01:45
c++11에 추가된 mutex는 객체간 동기화를 돕는 라이브러리이다. mutex는 윈도우 환경에선 내부적으로 크리티컬 섹션(CriticalSection)을 이용한다. 헤더: mutex네임스페이스: std 1. mutex 가장 일반적인 mutex. lock, unlock, try_lock의 멤버 함수를 가진다. 2. recursive_mutex 중첩 lock을 허용하는 mutex. 단, lock을 한 만큼 unlock을 해줘야한다. 다음 상황은 lock이 된 상태에서 또 lock을 했다. 일반적인 뮤텍스라면 데드락 상태에 빠지겠지만 recursive_mutex은 중첩 lock을 허용한다. class memstream{ public: bool allocated() const { mutex.lock(); //..