'C++11'에 해당되는 글 17건

  1. 2013.06.26 [C++11] Range Based For-Loop with custom type.
  2. 2013.04.26 [C++11 Overview] make_shared
  3. 2013.04.26 [C++11 Overview] emplace, emplace_back
  4. 2013.03.11 [C++11 Overview] RAII Classes for Mutexes
  5. 2013.03.11 [C++11 Overview] mutex
  6. 2013.03.11 [C++11 Overview] void future
  7. 2013.03.11 std::async - std::launch policy
  8. 2013.03.08 std::future.wait_until
  9. 2013.02.22 [C++11 Overview] Uniform Initialization Syntax
  10. 2013.02.22 [C++11 Overview] Raw String Literals

[C++11] Range Based For-Loop with custom type.

Short Articles 2013. 6. 26. 10:08

커스텀 타입의 멤버 컨테이너에 대해서 range based for 를 지원하고자 할 때,

멤버 또는 전역으로 begin, end 함수를 제공해 주면 된다.

커스텀 컨테이너 타입을 사용 중이라면 해당 컨테이너가 iteration 지원이 되는지 확인한다.


'Short Articles' 카테고리의 다른 글

deprecated declaration (VC++)  (0) 2013.07.20
[C++11] std::condition_variable_any  (0) 2013.03.12
std::async - std::launch policy  (0) 2013.03.11
Template Keywords & Introduce Templates Meta Programming  (0) 2012.04.21
Class Template  (0) 2012.04.07
:

[C++11 Overview] make_shared

Book Review 2013. 4. 26. 15:41

make_shared<T>(...) 는 T 의 생성자에서 요구하는 파라미터 값들을 인자로 주고

shared_ptr 객체를 얻습니다. 이 때, 표준상에서 구현이 강제되어 있지는 않지만

보통 make_shared 구현에서는  T 타입 객체에 대한 포인터와 참조카운트를 관리하는 객체의

메모리 할당을 하나의 메모리 블럭에 할당하는데, shared_ptr 객체를 직접 생성할 경우

두 군데의 다른 메모리 블럭으로 나뉘어지는 것에 비해 성능상 이득이 있다고 하네요.


cppreference 의 다음 글을 참조해보면 되겠습니다.


http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared


This function typically allocates memory for the T object and for the shared_ptr's control block with a single memory allocation (it is a non-binding requirement in the Standard). In contrast, the declaration std::shared_ptr<T> p(new T(Args...)) performs at least two memory allocations, which may incur unnecessary overhead.

Moreover, f(shared_ptr<int>(new int(42)), g()) can lead to memory leak if g throws an exception. This problem doesn't exist if make_shared is used.


:

[C++11 Overview] emplace, emplace_back

Book Review 2013. 4. 26. 11:33


vector 는 컨테이너 요소를 value 로 저장 하는데 auto_ptr 이나 unique_ptr 이나 value copy 가 안됩니다.
그래서 push_back 에서 에러가 발생하는데, std::move 를 통하여 rvalue 로 넘겨주거나 
인자를 rvalue 로 받아 해당 값을 파라미터로 받는 생성자를 컨테이너에서 바로 호출해 할당하도록 하는 
emplace 함수를 사용하면 됩니다. 
이 때, unique_ptr 은 std::move 를 통해서 명시적으로 넘겨줘야 합니다.


:

[C++11 Overview] RAII Classes for Mutexes

Book Review 2013. 3. 11. 16:15

RAII ( Resource Acquisition In Initialization ) 은 리소스 할당과 해제에 대해서 


Bjarne StousStrup (C++ 창시자) 이 제안한 프로그래밍 방법론 입니다.


위키 참조 : Resource_Acquisition_Is_Initialization


RAII 에 대해서는 Channel 9 - Going Native 2012 에서도 Bjarne 자신이 직접


설명하고 있습니다. Keynote-Bjarne-Stroustrup-Cpp11-Style


아무튼 mutex 에 대한 RAII 클래스는 lock_guard 와 unique_lock 두 종류가 제공 되는데,


1. std::lock_guard


lock_quard 의 경우 별다른 추가적인 기능이 없는 대신 사용이 매우 간단하고 오버헤드도 적습니다.


기존에 프로그래머들이 곧잘 만들어 사용하던 auto lock 류들과 흡사합니다.


객체 생성 블럭구간에 lock 을 거는 것이죠.

lock_guard 는 copy 나 move 가 불가능하며 별도의 추가적인 기능은 없습니다.


2. std::unique_lock

unique_lock 의 경우에는 좀 더 유연한 제어 방법들을 제공합니다. (그 만큼 어느 정도 오버헤드는 따라 붙지만...)

timed mutex 를 사용하는 경우엔 unique_lock 을 사용하라고 하고 있습니다.

unique_lock 은 lock_guard 와 마찬가지로 copy 는 금지 되어있지만 move 는 가능합니다.

그리고 lock_guard 가 enclosing block 내에서 자동으로 락을 거는 것과 달리

객체 생성 이 후 락을 걸 수 있고 객체 소멸 이전에 락을 풀 수도 있습니다.

여기서 mutex 는 동일 코드를 재귀하기 때문에 recursive_timed_mutex 를 사용했고

lock 객체의 생성자에서 데드락이 걸리는 것을 방지 하기 위해 파라미터로 defer_lock 를 주었습니다.

위 코드를 실행 시키고 잠시 기다리면 처음 critical section 에 진입한 스레드 외에


나머지 스레드들은 "input timed out." 메시지를 출력하고 종료되고


한 스레드만 입력을 대기하고 있게 됩니다.


문자 하나를 입력해 주면 다으모가 같은 결과가 나오게 됩니다.




:

[C++11 Overview] mutex

Book Review 2013. 3. 11. 14:34

future 에 이어서 소개하고 있는 부분입니다.


아무래도 멀티 스레드니 병렬 처리니 하는 부분들이 나오면 필수적으로 따라 붙는 부분이


데이터의 접근에 대한 안전 장치겠지요.


다음은 전역 선언된 int 변수 하나를 두개의 스레드에서 증가/감소 하는 코드입니다.

이전에도 프로그래머들이 종종 만들어 쓰는 auto lock 과 유사한 모습입니다.


c++11 의 mutex 는 mutex , timed_mutex , recursive_mutex , recursive_timed_mutex 4 종이 제공되고 있고,

이름상에서 나타나듯이 쓰임새가 차이가 납니다.

재귀적인 lock 작업에 non-recursive mutex 를 사용하면 미정의 동작을 하게 된다고 하네요.

ps. 위 코드에서와 같은 간단한 변수의 증감은 mutex 보다는 atomic 을 사용하는 것이 더 효율적입니다.


:

[C++11 Overview] void future

Book Review 2013. 3. 11. 14:06

책에서 void 타입의 future 활용에 대해서 따로 언급을 하고 있는데요..


다른 특정 정보 보다는 함수가 끝나는 시점을 알고자 할 때 유용하다고 하고 있습니다.


그러면서 wait() 과 get() 의 사용 선택 기준에 대해서도 언급하고 있는데


예외 발생을 알기 위해서는 get 을 선택하고, future_status 의 timeout 을 얻을 필요가 있다면


wait 을 선택하라고 하고 있습니다. ( 이 부분은 future 활용의 경험이 없어서 그런지 잘 와닿지를 않네요. )


아무튼 timeout 값은 wait 멤버 함수를 통해서, 예외 발생의 캐치는 get 멤버 함수를 통해서만 얻을 수 있다는 점은


숙지해 두어야 겠습니다.

'Book Review' 카테고리의 다른 글

[C++11 Overview] RAII Classes for Mutexes  (0) 2013.03.11
[C++11 Overview] mutex  (0) 2013.03.11
[C++11 Overview] Uniform Initialization Syntax  (0) 2013.02.22
[C++11 Overview] Raw String Literals  (0) 2013.02.22
[C++11 Overview] Unicode Support  (0) 2013.02.18
:

std::async - std::launch policy

Short Articles 2013. 3. 11. 11:44
아래 코드는 C++11 Overview 의 void future 를 설명하는 부분에 나오는 코드를 이용해서 좀 더 작성해본 것입니다.


기본적으로 C++11 표준에서 정의하는 std::launch 의 열거형 값은 async 와 deferred 두 가지 입니다.

vs2012 의 경우 namespace 가 launch 밑으로 한 단계 더 들어가고 async 와 deferred 외에 any 와 sync 를 더 정의하고 있습니다.

sync 는 deferred 와 동일하고 any 는 async | deferred 로 되어 있는데 MSDN 상에도 any 플래그에 대한 자세한 설명은 나와있지 않습니다.

아마도 컴파일러에게 선택을 맞기는 용도로 쓰이는게 아닌가 생각됩니다.


_launch_policy 값에 따른 결과는 다음과 같습니다.

async


deferred





'Short Articles' 카테고리의 다른 글

[C++11] Range Based For-Loop with custom type.  (0) 2013.06.26
[C++11] std::condition_variable_any  (0) 2013.03.12
Template Keywords & Introduce Templates Meta Programming  (0) 2012.04.21
Class Template  (0) 2012.04.07
Function Template  (0) 2012.03.31
:

std::future.wait_until

Code Snippet 2013. 3. 8. 18:14

cppreference.com 에 있는 std::future.wait_for 의 샘플 코드를


std::future.wait_until 로 바꿔 넣어 본 코드입니다.

(vs2012 는 future 를 지원하지만, gcc 는 4.8 beta 현재 미지원 입니다.)


요렇게 하면 고정된 목표 대기 시간을 처음 대기 때 넘겨버리기 때문에 

sleep_for 에 걸린 시간 만큼 루프를 돌면서 timeout 메시지를 주루룩 쏟아 냅니다.

async 의 첫번째 인자를 deffered 를 주면 future_status 는 deffered 가 나오고 timeout 은 나오지 않습니다.

실행이 지연되므로 ready 상태 역시 되지 않으므로 위와 같은 코드 상황이라면 무한 루프에 빠져 버리므로

주의해야합니다.


'Code Snippet' 카테고리의 다른 글

ItemQuote - Get Data From MySQL DB  (0) 2013.03.20
UdpEchoClientTimeout  (0) 2013.03.20
C++11 표준 지원에 대한 컴파일러별 처리  (0) 2013.03.06
BOM 확인  (0) 2013.02.19
Asio, a synchronous client, local port binding  (0) 2012.06.19
:

[C++11 Overview] Uniform Initialization Syntax

Book Review 2013. 2. 22. 15:12

C++11 에서는 다양한 초기화 형태를 일괄적으로 Brace 초기화로 통일시켜 표현할 수 있게 되었습니다.



vs2012 에서는 아직 지원하지 않고 있습니다.

'Book Review' 카테고리의 다른 글

[C++11 Overview] mutex  (0) 2013.03.11
[C++11 Overview] void future  (0) 2013.03.11
[C++11 Overview] Raw String Literals  (0) 2013.02.22
[C++11 Overview] Unicode Support  (0) 2013.02.18
[C++11 Overview] enum  (0) 2013.02.18
:

[C++11 Overview] Raw String Literals

Book Review 2013. 2. 22. 15:00

C# 이나 Python 등 다른 언어에서는 지원되던 Raw String 기능이


C++11 에서도 추가 되었습니다.


현재 vs2012 는 미지원 상태이고, gcc 4.8 에서는 테스트 가능합니다.

'Book Review' 카테고리의 다른 글

[C++11 Overview] void future  (0) 2013.03.11
[C++11 Overview] Uniform Initialization Syntax  (0) 2013.02.22
[C++11 Overview] Unicode Support  (0) 2013.02.18
[C++11 Overview] enum  (0) 2013.02.18
[C++11 Overview] nullptr  (0) 2013.02.18
: