C++
-
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)..
-
session의 send부분에 대한 고찰프로그래밍 2014. 11. 23. 22:01
push_data 부분을 size만큼 메모리를 할당하고 데이터 복사를 하는 방식으로 구현한다면 여러 thread에서 send를 호출하더라도 queue에 순차적인 데이터 push가 보장된다. push_data(data, size){ memory = new byte[size] // size만큼 메모리 할당 copy(data, memory) // 데이터 복사 send_queue.push(memory) // queue에 메모리를 push } 반면, push_data를 재귀하며 데이터를 고정된 버퍼에 담는 방식을 취한다면 순서가 섞일 수 있다. push_data(data, size){ byte buf[128] copy(data, buf) send_queue.push(buf) ... push_data(end, re..
-
[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(); //..
-
[c++] 람다 캡쳐를 잘못 사용했다.프로그래밍/의문 2014. 7. 10. 03:07
Socket* socket = queue_.front(); impl_.async_accept(*socket, [&](const ErrorCode& error) // 전부 참조([&])로 했을 때 socket이 쓰레기 값으로 받아졌었다. { if (error) { throw error; } else { accepted_sockets_.push(socket); // 여기서 쓰레기 값이 대입이 됨 } } ); 생각없이 저 코드를 썼다. 당시엔 이상한 점이 없다고 생각했지만 -_-; async 함수가 비동기 함수이다. bind가 된 완료함수가 언제 불릴지 모른다는 말. 따라서 스택에 있던 Socket* socket의 값은 완료함수가 호출된 시점에선 쓰레기 값이 되고, 나는 그걸 참조해서 사용하려 했던 것이다. ..
-
[c++] inline 함수 사용의 경우프로그래밍 2014. 7. 2. 14:57
inline 키워드는 일반 함수 코드가 매크로와 비슷하게 동작하도록 만들며 컴파일 시에 함수 링크가 방식이 아닌 내부 코드를 직접 붙이는 처리를 한다.(컴파일러가 판단하여 효율성이 떨어진다고 생각할 시에는 inline 시키지 않기도 한다.) 따라서, inline 함수의 경우 여기저기서 자주 호출될 시에는 프로그램 코드 자체가 비대해지는 경우가 생긴다. 따라서 매우 작은 단위의 함수가 아니라면 여러곳에서 빈번히 호출되는 함수의 사용에는 적합하지 않다. inline을 어떻게 활용하면 좋을까 생각을 했는데 c++ 환경에서는 함수 오버로딩이 가능하므로 다음과 같은 상황을 처리하는 코드의 작성이 많다. void put(int val);void put(int a, int b); void put(int a, int ..