블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

 

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())

Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함