2013-05-22 4 views
3

64 비트 컴퓨터에서 Linux를 사용하고 있으며 g ++ 4.8을 사용합니다.사용자 정의 할당자를 사용하여 벡터의 크기를 줄입니까?

sizeof(std::vector<float>) = 24 
sizeof(std::vector<double>) = 24 
sizeof(std::vector<long double>) = 24 

내 질문은 : sizeof 운영자가 std::vector 반환에 적용 내 응용 프로그램 요소의 이상 1 GB의 벡터를 필요가 없습니다 것이라는 사실을 기반으로 작은 크기와 벡터를 만들 수있는 방법이있다 ? 최적으로, 나는 16 바이트의 벡터를 가질 수있다 : 시작 (8 바이트), 현재 크기 (4 바이트) 및 현재 용량 (4 바이트)에 대한 포인터. 내 자신의 벡터를 처음부터 다시 코딩해야합니까? 아니면 사용자 정의 할당자를 사용하여 크기를 줄일 수 있습니까?

이 크기는 100TB 이상의 메모리가있는 수퍼 컴퓨터에서 작업 할 때 매우 중요합니다. 기본 클래스에서 얻을 수있는 모든 바이트가 결국 몇 TB의 메모리를 절약 할 수 있습니다.

+0

소리가 나에게 들리 듯 ... "기본 클래스에서 얻을 수있는 모든 바이트가 결국 몇 TB의 메모리를 절약 할 수 있습니다."몇 백만 개의 벡터가 있다면 ... 예 ... 벡터의 요소는 아니지만 벡터 그 자체. 당신은 벡터가 1GB 이상의 요소를 가지지 않을 것이라고 말합니다 ...당신이 주장하는 벡터의 수와 같은 것이 있다면, 당신이 이야기하는 총 메모리의 100TB- 규모를 감안할 때, 수백 바이트 이상을 평균 할 수 없으며, 따라서 수백 개의 요소를 평균화 할 수 없습니다. –

+0

예 수천 개의 코어에 수십억 개의 벡터가 배포 될 수 있습니다. 구현을 다시 생각하려고 노력 하겠지만 쉽지는 않습니다. – Vincent

+0

이 경우, 힙 할당 라이브러리가 벡터 당 많은 추가 공간을 낭비하는지 여부를 매우주의 깊게 살펴야합니다. 벡터의 많은 부분이 비어 있거나 하나의 요소가 많은 것처럼 들리므로 몇 개의 센티넬 값 (아마도 NaN, 무한대)을 남겨 둘 수 있다면 단일 값으로 비어 있지 않은 비어있는 단일 문자를 인코딩 할 수 있습니다 적절한 벡터가 필요한 요소와 센티넬. –

답변

2

아니요, 할 수 없습니다.

할당 자의 원래 아이디어는 포인터와 참조 유형에 대한 객체를 데이터에 정의 할 수 있다는 것이 었습니다. 그러나 그것은 더 이상 허용되지 않습니다. allocator<T>::pointerT*이어야하며 컨테이너는 자유롭게 컨테이너가 있다고 가정 할 수 있습니다.

그래서 어떤 종류의 컴팩트 포인터 표현을 사용하는 벡터가 필요하다면 직접 구현해야 할 것입니다.

표준 라이브러리 컨테이너는 대부분의 용도에 적합한 기본값입니다. 그러나 특별한 필요가있는 사람들에게는 다른 것으로 대체해야 할 수도 있습니다. 그것은 여기에있는 것처럼 보입니다.

+3

C++ 11은'allocator :: pointer'가'T *'이어야한다는 요구를 완화했습니다. 무작위 액세스 반복자 여야하며, 'NullablePointer'요구 사항을 충족시키고 표 28 - 할당 자 요구 사항의 다른 요구 사항을 충족해야합니다. –

+0

@HowardHinnant :'std :: vector :: data'는'allocator :: pointer' 대신에'T *'를 어떻게 리턴 할 수 있습니까? –

+0

libC++ (http://libcxx.llvm.org)에는이를 수행하는 구현이 있습니다. 'smart_pointer '을'operator ->()'를 사용하여'T *'로 바꾸는 귀여운 트릭이있다. 즉, libC++을 임의의'allocator :: pointer'에 완전히 부합시키기 위해 노력하고 있습니다. (이 타입을 입력하면됩니다.) –

1

벡터는 전통적으로 세 개의 포인터 (저장소의 시작, 끝 및 끝)를 사용하여 구현됩니다. 이들을 축소하는 유일한 방법은 실제로 내부 표현을 변경하는 것입니다.

0

이 크기는 vector의 구현에 내장되어 있으므로 편리하게 줄일 수는 없습니다 (32 비트 모드로 구축하면 포인터 크기가 작아지기 때문에 크기가 줄어들 것입니다). 코드에서 vectors의 수조를 사용하는 경우

아마 당신은 수 (vector 더 큰로 결합?) 것을 줄이기 위해 오히려 부부가 각각 떨어져 바이트 면도하는 것보다 시도 할 수도 있습니다.

0

정리해야 할 것이 있습니다. 벡터 크기가 커지면 벡터 크기와 용량 데이터가 비교적 매우 작아집니다.

크기가 1 백만인 이중 벡터가 있다고 가정 해 보겠습니다. 크기 및 용량 데이터는 여전히 총 ​​8 바이트를 차지하며 벡터가 보유하는 주 데이터와 비교하여 매우 분입니다.

매우 작은 벡터 (예 : 1 ~ 50)를 자주 사용하는 경우 배열에 래퍼를 작성하여 사용하면 작은 벡터 데이터 그룹에 std 벡터가 적합하지 않을 수 있습니다. 귀하의 RAM이 100 TB인지 또는 하드 드라이브 용량인지는 알 수 없지만 많은 작은 크기의 데이터 구조를 유지하는 것은 좋은 생각이 아닐 수도 있습니다. 그 동안 심한 memory fragmentation 초를 초래할 수 있습니다.

+0

예 avaible RAM은 최대 300TB까지 가능합니다. 내가 해결하려고하는 문제는 근본적으로 분열되어 있지만 메모리 크기 대 메모리 조작 (액세스/삽입)을 교환하려고 노력할 것입니다. – Vincent

관련 문제