SGI::STL
STL에는 문자열을 다루기 아주 좋은 string이라는 객체가 있다. 이 객체는 실제 요구하는 메모리 양보다 더 많은 메모리를 할당하고 있을지 모른다. 이는 append 연산을 자주한다면, 매번 추가할 메모리를 잡는 것보다 넉넉하게 잡아놓고 채워 나가는게 더 빠르기 때문이다.
문제는 이것이 모든 string객체가 적용받는다는 건데, 만약 append 연산을 하지 않는 녀석이라면? 괜스레 많이 잡아놓고 쓰지도 않는다면 대략 낭비라는거다.
STL에는 문자열을 다루기 아주 좋은 string이라는 객체가 있다. 이 객체는 실제 요구하는 메모리 양보다 더 많은 메모리를 할당하고 있을지 모른다. 이는 append 연산을 자주한다면, 매번 추가할 메모리를 잡는 것보다 넉넉하게 잡아놓고 채워 나가는게 더 빠르기 때문이다.
문제는 이것이 모든 string객체가 적용받는다는 건데, 만약 append 연산을 하지 않는 녀석이라면? 괜스레 많이 잡아놓고 쓰지도 않는다면 대략 낭비라는거다.
#include <string>
#include <iostream>
using namespace std;
int
main(int,char**)
{
string str1;
string str2("hello, world!");
string str3("hello, world!");
str3 += "okay";
cout << "str1.capacity() " << str1.capacity() << endl;
cout << "str2.capacity() " << str2.capacity() << endl;
cout << "str3.capacity() " << str3.capacity() << endl;
return 0;
}
STL개발회사나 라이브러리 버전에 따라 전략이 다른데, Linux에서 흔히 쓰는 gnu libstdc++ 두 가지 버전으로 해봤다. 자, 결과가 어떻게 나올까? 아래와 같다.libstdc++-3.4.4-2
str1.capacity() 0
str2.capacity() 13
str3.capacity() 17
libstdc++-4.1.2-12
str1.capacity() 0
str2.capacity() 13
str3.capacity() 26
뭐, 좀더 해봐야 알겠지만 대충 짐작컨데 이럴꺼라 믿어 의심치 않는다.- 두 버전 모두 표준 생성자는 메모리를 할당하지 않는다.
- 두 버전 모두 const char*을 입력으로 받는 생성자는 문자열 길이만큼만 메모리를 할당한다.
- 3.4.x는 append( =+ 연산자)에 대해 단순히 증분한 문자열 길이만큼만 증분하고, 4.1.x는 현재 길이 2배이다.
- 만약 4.1.x에서 현재 길이 2배를 해도 증분한 문자열 길이를 포함하지 못할 경우, 증분할 문자열 길이만큼만 증분한다. (이 실험은 str3에 13바이트를 초과하는 문자열을 append했을 경우 정확히 그 길이만큼만 증분하는 것으로 이 문서에 올리지 않겠다)
댓글
댓글 쓰기