Programming/Modern c++ 4

string literal은 어디에 저장될까?

C++ 프로그램에서 string 값을 어떤 변수에 담지 않고, 곧바로 값으로 표현한 것을 string literal 이라고 부른다. 그렇다면 string literal은 어디에 저장될까? Heap memory는 일단 절대 아닐 것이고, 그렇다면 Stack 인가? 정답은 둘다 아니다.. [저장되는 위치] ○ 스트링 리터럴은 대부분 내부적으로 메모리의 읽기 전용 영역에 저장된다. ▶ '대부분'인 이유는 이 동작이 platform 마다 다를 수 있기 때문이다. ▶ 하나의 예로, 간단한 구조를 가지는 칩에서는 read-only memory segment를 지원하지 않을 수 있기 때문에 writable 할 수 있다. ○ 읽기 전용 영역에서 데이터 영역 [저장되는 방식] ○ string은 static storage..

std::string_view

String view는 C++ 17부터 지원한다. [Background] string 타입 변수를 읽기만 하고 수정하지 않는 함수가 있다고 하자. C++17 이전에는 이 함수의 parameter type을 쉽게 결정할 수 없었다. 왜냐하면 string은 char[], char*, std::string 과 같이 종류가 다양하기 때문이다. 이런 문제를 해결하기 위해서 도입된 것이 string_view type이다. [string_view] ▶ string_view는 대부분 pass-by-value로 전달한다. string에 대한 pointer와 길이만 가지고 있기 때문에 복사하는데 오버헤드가 적기 때문이다. ▶ string_view를 사용하면 함수를 호출하는 부분에서 복사 연산이 발생하지 않는다. ▶ 따라서..

[Benchmark] Passing std::string as function parameter

어떤 class의 멤버변수로 string을 넘겨주어야 할 경우, 크게 두 가지 옵션이 있다. 1. const reference로 받은 뒤 멤버변수에 복사한다. 2. value로 받은 뒤 std::move를 사용해서 멤버변수를 초기화 시킨다. 이론상 2번 방법이 좀 더 효과적이라고 생각했는데, 실제 benchmark 결과 1번이 더 빠른 것을 확인했다. Function parameter로 받아은 값을 class member variable로 설정해야 하는 경우 이 경우에는 외부의 값을 받아서 class member variable로 설정해야 한다는 점에서 특수성이 생긴다. (주로 constructor에서 이런 작업들이 일어난다) (class member variable이 어떤 데이터의 reference v..

C++ 표준 난수 라이브러리 <random>

완벽한 Random number를 소프트웨어로 생성하기란 불가능하다. 그래서 의사(pseudo) 난수 생성기라고도 부른다. 무작위인 것 처럼 보이게 만드는 수학 공식에 따라 생성하기 때문이다. C++에서 제공하는 표준 난수 라이브러리를 사용하기 위해서는 아래와 같이 헤더를 추가해 주어야 한다. #include 기존의 C-style 난수 생성방법은 여러가지 문제들이 있었다. 이를 보완하기 위해서 C++에서는 좀 더 퀄리티가 좋은 난수 생성기를 제공한다. C++ radom 라이브러리는 크게 두 가지 구성으로 이루어져 있다. - Engine - Distribution Engine Engine은 기본적으로 uniform distribution을 따르는 random number를 생성해 준다. Engine은 se..