C++ 9

C++23 : stacktrace

Visual Studio 2022 의 최신 C++ 도입내용을 살펴보다 반가운 내용이 있어 오랜만에 블로그를 열었다. 드디어 콜스택을 확인할 수 있는 헤더를 VS에서 사용할 수 있게 되었다. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p0881r7.html A Proposal to add stacktrace library template string to_string(const basic_stacktrace & st); template basic_ostream & operator D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(331): CppPractice!__scrt_co..

C++ 2022.11.27

C++20 : std::ranges #3 - range 를 컨테이너로 변환하기

요약 지금은 방법이 없다. ranges::common_view 가 VS에 구현될 때까지 다음 함수를 정의해서 쓰자. template requires std::ranges::range auto toVector(Rng& rng) { std::vector v; if constexpr (std::ranges::sized_range) { v.reserve(std::ranges::size(rng)); } std::ranges::copy(rng, std::back_inserter(v)); return v; } 서론 2021년 3월, VS2019 를 기준으로 포스팅을 하다보니, 아쉬운 점이 많다. 컨테이너를 range 로 변환할 때에는 다음과 같이 views::all() 을 사용하면 되니 간단하다. std::vecto..

C++ 2021.03.24

C++20 : std::ranges #2 - iota_view 만들기

2022.11.27 추가 - VS2022에 std::ranges::views::iota() 가 구현되었다. 이제 다음과 같은 코드를 작성할 수 있다. auto v = std::ranges::views::iota(0) | std::ranges::views::take(3); VS2019 에 구현되지 않은 iota_view 를 간단하게나마 구현하면서 커스텀 range 를 만드는 방법을 간략히 알아보자. 참고로, 표준에서 구현될 예정인 iota_view 의 실제 구현 방식은 다음 문서에서 확인할 수 있다. isocpp.org/files/papers/p0789r0.pdf 만들고자 하는 것 : iota_view 먼저, iota_view 가 어떤 식으로 동작해야 하는지를 알아보자. 헤더에 구현되어 있는 std::io..

C++ 2021.03.22

C++20 : std::ranges #1 - views

std::ranges 가 드디어 c++20 에서 표준화 되었으나, github.com/ericniebler/range-v3 에서 구현됐던 내용의 일부만 들어오거나 다른 부분들이 있어, 이번 기회에 VS2019에 구현된 내용들만 정리해보고자 한다. 현재 사용중인 VS버전은 다음과 같다. Visual Studio Community 2019 - 16.8.5 라이브러리는 16.6버전에서 최초로 릴리즈 되었으므로 혹시 버전이 위 버전보다 낮다면, 업데이트를 해야 한다. VS에서 라이브러리 등의 c++20 피쳐를 사용하려면, 프로젝트 속성에서 다음 옵션을 줘야 한다. VS2019에 구현되어있는 views views::single views::all views::filter views::transform views:..

C++ 2021.03.17

C++ : shrink_to_fit()

c++11에서 새로 도입된 함수 shrink_to_fit()은 기존에 swap()밖에 없었던 연속된 메모리를 가진 컨테이너의 capacity를 줄여주는 함수다. vector v; 로 현재 size에 맞게 capacity를 줄이는데 다음 한 줄이면 된다. v.shrink_to_fit(); 함수의 내부적인 동작은 기존의 swap을 통한 메모리 재할당과 동일하다. 이 함수는 non-binding 함수인데, 이것이 의미하는 것은 "컴파일러 회사한테 구현하라고 만들어놨지만, 꼭 구현해야 하는건 아냐" 라고 한다. 이 함수가 non-binding 인 이유에 대해서는 stack overflow에서도 말이 많은 것 같지만 대표적인 이유는 이거다. 너무 비싸서 만드는 데 돈이 많이 드는 것이 아니라, 원소를 복사하는데 ..

C++ 2020.12.13

TBB - 병렬 컨테이너 사용 (concurrent_hash_map) : GameServer에서 유저의 <id, index> 정보 관리

서론 : 게임서버에서 유저 정보를 포인터로 관리하면 안되는 이유 졸업작품 게임 서버를 만들고 있는 지금, 안그래도 시간이 부족한데 포스트까지 작성할 시간이 있을지 고민이 많이 되었다. 하지만 경험 상 내가 겪었던 문제를 기록하지 않으면 같은 문제에 똑같이 시간을 낭비할 수 있으므로.. 지난 NDC 2014에서 정내훈 교수님께서 발표하셨던 "멀티스레딩 왜이리 힘드나요 시즌 2" 시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요? Lock-free 멀티쓰레드 프로그래밍 기법과 Transactional Memory를 실제 사용예제를 통해 설명하고, 성능을 보여줌. www.slideshare.net 에서 concurrent_hash_map을 이용한 쌍으로 유저 관리! 라는 부분을 보고 '아차' 싶은 생각이 들었..

C++ 2020.12.13

cocos2d-x사용 시 rc.exe이(가) 종료되었습니다 해결법

cocos2d-x로 프로젝트를 진행하다가 독립적으로 프로젝트를 분리할 필요가 있어서 다른 곳에 프로젝트를 새로 생성하여 cocos2d 폴더와 cocosDenshion 폴더를 옮기고 dll과 lib파일까지 다 옮겼는데 실행이 안될 때가 있다. " rc.exe이(가) 종료되었습니다 " 라며 코드 1을 리턴한다. 프로젝트 이름이 한글이기 때문이었다. 프로젝트 이름과 경로에 한글이 없도록 변경하면 해결된다.

C++ 2020.12.13

Volatile : 멀티쓰레드 프로그래밍 시 거의 쓸모 없는 그 것

Volatile : 멀티쓰레드 프로그래밍 시 거의 쓸모 없는 그 것 원본 : http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/ 의역, 오역 주의.한 줄 요약 : volatile은 컴파일러 최적화를 꺼주는 역할이다. 메모리 일관성을 유지하려면 mfence를 사용하자. volatile 키워드가 멀티쓰레드 프로그래밍에 유용하다는 소문이 널리 퍼졌다. 내가 처음 volatile 수식어를 봤을 때, 당연히 "멀티 쓰레드 프로그래밍 할 때 유용하겠는데?"라고 생각했다. 몇 주 전까지는 유용하다고 생각했다. 몇 주 전, volatile이 멀티쓰레드 프로그래밍에 거의 쓸모가 없다는 ..

C++ 2020.12.12