2004년 6월 14일 월요일

string.reserve()

The C++ Standard Libray - A tutorial and reference 의 486을 보면
다음과 같은 설명이 있다.
string::capacity() : reallocation없이 사용할 수 있는 문자수 return
string::reserve(n) : reallocation을 피하기 위해 n만큼 메모리 확보
string::reserve() : argument를 주지 않으면 현재 저장된 character size로 shrink

그래서 RedHat Linux 8, 9 (g++ 2.9.6과 g++ 3.2.2에서 실험했다.)

$ cat a.cpp
#include <string>
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    std::string s;

    s = "hi";
    cout << "1 - s.capacity() : " << s.capacity() << endl;
    s.reserve(10);
    cout << "2 - s.capacity() : " << s.capacity() << endl;

    s.reserve(100);
    cout << "3 - s.capacity() : " << s.capacity() << endl;

    s.reserve(1000);
    cout << "4 - s.capacity() : " << s.capacity() << endl;

    s.reserve(100);
    cout << "5 - s.capacity() : " << s.capacity() << endl;

    s.reserve(10);
    cout << "6 - s.capacity() : " << s.capacity() << endl;

    s.reserve(1);
    cout << "7 - s.capacity() : " << s.capacity() << endl;

    s.reserve();
    cout << "8 - s.capacity() : " << s.capacity() << endl;

    return 0;
}

g++ 2.9.6의 경우
1 - s.capacity() : 16
2 - s.capacity() : 16
3 - s.capacity() : 16
4 - s.capacity() : 16
5 - s.capacity() : 16
6 - s.capacity() : 16
7 - s.capacity() : 16
8 - s.capacity() : 16

g++ 3.2.2의 경우
1 - s.capacity() : 2
2 - s.capacity() : 10
3 - s.capacity() : 100
4 - s.capacity() : 1123
5 - s.capacity() : 1123
6 - s.capacity() : 1123
7 - s.capacity() : 1123
8 - s.capacity() : 1123

g++ 2.9.6은 reserve()가 그냥 폼으로 있는 것 같고;;
g++ 3.2.2는 reserve기능은 되나 shrink는 안되는 것 같다.
(사실 shrink안되는 편이 성능에 유용할지도..)

댓글 없음:

댓글 쓰기