프로그래밍
-
우측값 참조로 받은 값은 우측값일까?프로그래밍/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++14] shared_mutex와 shared_lock의 사용프로그래밍/c++ 2015. 3. 24. 12:52
c++14에서 추가된 shared_mutex와 shared_lock_guard는 리더즈-라이터 락(Readers-Writer Lock)이다.(리더즈 라이터 락?)컨테이너에 데이터를 추가할 땐 일반적인 lock_guard를 사용하고, 컨테이너에 있는 데이터를 사용하기만 할 때에는 shared_lock_guard를 사용한다. 사용 예를 보자 컨테이너에 데이터를 추가할 때 일반적인 lock_guard를 사용하는 모습이다.123456789 void add_thread(thread* thrd) { if(thrd) { boost::lock_guard guard(m); threads.push_back(thrd); } } 컨테이너를 순환하며 어떤 함수를 호출하는 과정에서는 shared_lock을 사용했다.1234567..
-
컴파일러 경고 warning C4127프로그래밍/의문 2015. 3. 20. 05:53
무한 루프, 즉 while(true){ ... } 를 하려고 했는데 그때 위험 경고 warning C4127이 발생했다. 컴파일러 경고 수준을 4로 해놓으면 발생하는 거 같은데 다음과 같이 우회하여 경고를 지울 수 있다 123456789while(true) // warning! C4127{ // break;} for(;;) // ok{ // break;} MSDN에 저렇게 우회를 할 수 있다고 하는걸 봐선 무한 루프를 사용할 때에는 while, 또는 do while이 아닌 for(;;)를 권하는 건가 싶다. 오류 메시지조건식이 상수입니다. conditional expression is constantwhile 루프 또는 if 문의 제어 식이 상수로 계산됩니다. 루프가 중간에서 종료되어 while 루프의 ..
-
-
반환값 최적화 RVO, NRVO프로그래밍/기록, 개념, 용어 2015. 3. 1. 18:50
클래스 내에서 어떤 객체를 반환하고 싶다. 하지만 반환되는 과정의 오버헤드가 두려울 수 있다. 1234std::string get_name() const{ return std::string(my_name);} 일단 저 구문을 보면 이렇게 될거라 생각할 수 있다. 3에서 임시 객체가 만들어지고, 그걸 반환하면서 복사 생성자가 또 호출될 것이다!과거에는 그랬다. 하지만 근래의 컴파일러는 다음처럼 내용을 바꿔버린다. 1234void get_name(std::string& dest) const{ new(&dest)std::string{my_name};} 이를 반환값 최적화(Return Value Optimization)라고 하며 이것에 의해 다음과 같은 구문들은 사실상 같은 것일 수도 있다. std::array..
-
std::copy(memcpy)와 std::move(memmove)의 차이프로그래밍/c++ 2015. 2. 20. 23:05
memcopy는 서로 같은 메모리에 복사를 하는것이 아니라는걸 가정하에 하는 반면memmove는 서로 같은 메모리 영역에 복사를 할 수도 있는 상황을 가정한다. memmove위 그림처럼 같은 메모리에서 내 이동이 가능하므로 move라는 네이밍이 붙는다. 코드로 차이점을 풀어보자면... char buffer0[100];char buffer1[100]; std::memcpy(buffer1, buffer0, sizeof(buffer0)); // OKstd::memcpy(buffer0, buffer0, sizeof(buffer0)); // NO! std::memmove(buffer1, buffer0, sizeof(buffer0)); // OKstd::memmove(buffer0, buffer0, sizeof(b..