2013-07-16 3 views
0

검사의 크기는 항상 4 바이트, 나는 Qt는 데이터의 암시 적 공유로 인해 있으리라 믿고있어 반환5 바이트 QByteArray의 메모리 풋 프린트. 5 바이트의 quint64 또는 QByteArray가 저장에 더 효율적입니까? QByteArray의

int n = 50; //or n = 100, 200 
QByteArray arr(n,'a'); 
cout << sizeof(arr) << endl; 
::getchar(); 

항상 4

가 어떻게 QByteArray의 실제 메모리 사용량을 추정 할 수 인쇄? 질문은 많은 수의 5 바이트 식별자를 효율적으로 저장함으로써 동기 부여됩니다. 각각 quint64 (각각 8 바이트 사용, 3 바이트가 낭비 됨) 또는 QByteArray로 저장 될 수 있습니다. 그러나 어떻게해야할지 모르겠습니다. .... 후자의 경우에 오버 헤드를 추정

내가 QMap의 핵심 이러한 식별자를 사용하고자하는, 그래서 그들은 각각 자신의 구조에 있어야합니다 - 하나의 긴 QByteArray가 작동하지 않습니다 ...

+0

5 바이트를 효율적으로 저장하려면 일반 오래된 구조체는 어떻습니까? –

+0

@Roku 어떻게 그들을 POD로 저장할 것인가? 비교 연산자와 char [5]를 포함하는 구조체? –

+0

아마도 구조체를 사용하는 것이 좋지 않습니다. 적어도 QByteArray를 사용하는 것이 더 쉽습니다. 그건 그렇고, 얼마나 많은 5 바이트 식별자를 가지고 있습니까? 200 명 이상? –

답변

1

(Qt는 4.8) QByteArray에 대한 실제 데이터는 다음과 같이 qbytearray.h에서 발견 보이는 할 수있다 : 당신의 데이터가에 맞는 경우

struct Data { 
    QBasicAtomicInt ref; 
    int alloc, size; 
    char *data; 
    char array[1]; 
}; 

은 그래서 quint64 적은 스토리지를 사용합니다.

1

sizeof (arr)는 객체의 포인터 크기를 보여줍니다. do arr.squeeze(); 다음 arr.capacity();

그러나 마지막 코드에 대한 squeeze 호출을 유지하지 마십시오.이 코드는 객체에 의해 사전 할당되지 않은 사용되지 않은 메모리를 제거하므로 재 할당 및 memcopies (값 비싼)가됩니다.

+0

예, 실제 크기를 어떻게 계산합니까? –