2013-08-15 9 views
1

몇 개의 큰 (100,000에서 10,000,000까지) 객체 벡터가 있습니다.) (구조체의 벡터에서 구조체에서 std :: string 대신 char []을 사용하여 POD가되어야합니까?

typedef struct { 
    std::string name; 
    int   number; 
    long   offset; 
} 

나는 개체의 많은 수를 포함하는 벡터를 재사용 할,하지만 난 분명히 호출 할 때 걱정 해요 :

typedef struct { 
    char name[64]; 
    int number; 
    long offset; 
} 

대신 : 나는 같은 구조에 충실해야 , std :: string 함께 구조체를 사용하는 경우, 나는 1,000,000 소멸자 호출 결국 것입니다.

std :: string 대 char []을 사용하면이 문제가 자주 발생합니까?

+0

루프에서 10000000 개의 요소를 만들고 지우고 있습니까? 그리고 정말로 모든 단일 요소가 메모리에 저장 될 필요가 있습니까? – milleniumbug

+0

@milleniumbug : 사실, 그게 유일한 문제는 아닙니다. 수백만 개의 요소를 섞어서 백만 명의 소멸자를 호출하면 참고 지역이 너무 나빠지므로 정리 작업에 오래 걸릴 것입니다. – MSalters

+0

@milleniumbug : 메모리에 저장된 모든 요소가 필요합니다. 저는 모든 데이터를로드 한 후 모든 업데이트에 대한 timeseries에 대한 다양한 통계를 계산하고 계산 한 다음이를 시각화에 추가하는 timeseries 데이터 작업을하고 있습니다. 일부 통계는 창 데이터를 기반으로하며 누적되므로 일부 계열을로드 할 수 없습니다. 또한 모든 것을 시각화하고 있습니다. 출력은 모든 점에 대한 시간 표시기에 관한 데이터가 들어있는 다른 벡터의 개체입니다. – bpeikes

답변

2

예, 많은 소멸자 호출이 발생합니다. 그리고 당신의 현은 힙 전체에 뿌려 질 것입니다.

문자열의 대부분이 64 자보다 훨씬 짧은 경우 메모리 풀링을 고려할 수 있습니다. 이 기능은 벡터에만 추가 한 다음 모든 부분을 지우는 것이 좋습니다. 그렇게하면 문자열을 메모리에 꽉 채울 수 있고 char*을 구조체에 저장할 수 있습니다.

그러나 메모리 풀과 string을 모두 사용하면 문자열 데이터가 구조 외부에 저장되어 캐시 위치에 영향을줍니다. 많은 문자열을 큰 메모리 덩어리로 묶을 수 있기 때문에 메모리 풀이 있으면 지역이 더 좋지만 다른 구조체 데이터 근처에는 아무 것도 없습니다. 프로그램이 캐시에서 중요한 이점을 얻는다면 문자열 인라인을 char 배열로 유지하고 싶을 것입니다.

+1

이것은 맞춤 문자열 클래스로 큰 우승을 한 경우입니다. 작은 문자열 최적화는 모든 문자열이 아니지만 대부분이 작을 때 큰 이점입니다. 16 바이트 문자열 클래스를 갖는 것이 내 문자열에 적합한 장소였습니다. – MSalters

+0

@MSalters 커스텀 클래스를 만들기 전에 char [16]을 사용하고 싶습니다. 그것이 내 문제가있는 곳인 것처럼 보이지 않습니다. – bpeikes

1

많은 문자열 클래스 구현은 요즘 힙에있는 것이 아니라 객체 내부에 짧은 문자열을 저장할만큼 똑똑합니다. 이 경우 소멸자 std::string은 저렴합니다.

빠른 검사는 &str[0]str 내에 있는지 확인하는 것입니다.