std::string, std::wstring에 대해 알아보자
C언어,ARM / 2020. 1. 18. 22:39
std::string, std::wstring에 대해 알아보자 C언어에는 char, TCHAR등의 문자열 관련 타입이 있다. std::string은 템플리트(template)이다. template은 일종의 매크로이다.(그러나 매크로와는 다르다) 또한 클래스와 비슷하게 ::라든가, 멤버함수등을 사용할 수 있다.(정확히 멤버함수라고 하기에는 애매하다) 어쨌든, std::string을 클래스로 봐도 거의 무방하다. int len; std::string a("abcd"); a+="e"; len=sizeof(a);//len=28 a "abcde" std::basic_string[size] 5 unsigned int [capacity] 15 unsigned int [0] 97 'a' char [1] 98 'b' char [2] 99 'c' char [3] 100 'd' char [4] 101 'e' char 위 코드에서 15바이트를 할당해 놓은것을 볼 수 있다. 문자열 추가 연산을 할 경우, 15바이트 이하라면, 메모리할당을 하지 않아서, 빠르게 처리가 가능하다. 물론, 미리 할당해놓은 크기를 넘어서면, 메모리할당을 해야해서, 많이 느려진다. std::string변수의 크기가 28이나 된다. 문자열데이터는 4+1바이트인데, 약 5~6배 더 큰것을 알 수 있다. std::string은 ANSI코드이고, std::wstring는 유니코드이다. _T()매크로는 유니코드로 컴파일할 경우, 유니코드 문자열로 변환되고, ANSI로 컴파일할 경우, ANSI문자열(char*)로 변환된다. std::wstring b(_T("abcd")); b+=_T("e"); len=sizeof(b); 어셈블러(기계어)코드를 보면, 아래와 같이, 함수 호출이 발생한다. 문자열 추가 연산도 함수 호출. int len; std::string a("abcd"); 009A7C4D push 0BA6DD0h 009A7C52 lea ecx,[a] 009A7C55 call std::basic_string ::basic_string (0994E2Ah) 009A7C5A mov byte ptr [ebp-4],1 a+="e"; 009A7C5E push 0BC7374h 009A7C63 lea ecx,[a] 009A7C66 call std::basic_string ::operator+= (099988Fh) len=sizeof(a); 009A7C6B mov dword ptr [len],1Ch std::string 변수 할당 과정을 따라가보면, 상당히 많은 코드를 처리한다. 따라서, std::string가 편하다고 해도, 많은 메모리를 사용하고, 속도가 생각만큼 빠르지 않다는것이다. static void test0() { char a[16]; strcpy(a,"abcd"); } static void test1() { std::string a("abcd"); //생성, 파괴 } DWORD get_func_time(void (*f)()) { DWORD t,i; t=GetTickCount(); for(i=0;i<100000;i++) { f();f();f();f();f();f();f();f();f();f();f();f();f();f();f();f();f();f();f(); } return GetTickCount()-t; } DWORD t[2]; t[0]=get_func_time(test0);//125 t[1]=get_func_time(test1);//25615 예상대로, 약 200배이상 느리다. 물론, 이런 코드만 사용하는것이 아니므로, std::string이 항상 느리다고 볼 수 는 없으나, c언어의 기본 함수만을 사용했을때가, 대부분 빠르다. 프로그램 코드 사이즈도 c언어 기본함수만 사용했을때가 작다. 물론 속도가 가장 중요한 것은 아니지만, std::string을 많이 사용할 수 록 프로그램은 무거워지고, 느려진다. 200배나 느려진다. 반대로 말하면, std::string을 사용한 프로그램보다, c언어 기본함수만을 사용한 프로그램이 약 200배 더 빠르다는 말이다. char* 형으로 변환 방법 : (char*)(변수.c_str())
'C언어,ARM' 카테고리의 다른 글
error C2144: 구문 오류 : int'은(는) ';' 다음에 와야 합니다. (0) | 2020.01.18 |
---|---|
UPDI (0) | 2020.01.18 |
cc1plus.exe: warning: command line option "-std=gnu99" is valid for C/ObjC but not for C++ (0) | 2020.01.18 |
Visual Studio 2012 - 리소스, 파일 추가후 인식이 잘 안되는 문제 (0) | 2020.01.16 |
error C2059: syntax error : 'bad suffix on number' (0) | 2020.01.11 |