2011-04-08 1 views
10

이 간단해야한다 반환하지만 어디서 문제를 찾을하는 단서가 없다 : 나는 sizeof(region)을 수행 할 때를 sizeof (구조체) 예상치 못한 값

struct region 
{ 
public: 
    long long int x; 
    long long int y; 
    long long int width; 
    long long int height; 
    unsigned char scale; 
}; 

이 나에게 을 제공합니다

내가 구조체를 40 내가 기대할 때 .

아이디어가 있으십니까? 그것은 8 바이트 경계에 맞게 구조체 패딩 것

+0

@sth : 편집 내용은 무엇입니까? – eriktous

+1

@eriktous : 나는 질문을 좋아했으며 질문에 아무 것도 추가하지 않은 텍스트를 제거하여 신호 대 잡음 비율을 높이려고했다. – sth

답변

10

(와 Mingw의 GCC는, 64 OS를 승리). 그래서 실제로 메모리에서 40 바이트를 사용합니다 - sizeof 올바른 값을 반환합니다.

당신은 단지 다음 packed 속성을 지정 33 바이트를 취하려면 다음

struct region 
{ 
public: 
    long long int x; 
    long long int y; 
    long long int width; 
    long long int height; 
    unsigned char scale; 
} __attribute__ ((packed)); 
+7

'packed' 구조의 배열을 사용하면 정렬되지 않은 구조체의 요소 때문에 성능이 심각하게 저하 될 수 있습니다. –

+0

고마워요! – George

+2

packed_sizeof (MyStruct)를 얻을 수있는 방법이 있습니까? 이 방법은 하나의 구조를 사용하여 압축을 풀고 좋은 성능을 얻을 수 있지만 파일에서 읽을 구조체의 실제 크기를 사용할 수 있습니다 – codymanix

5

long long int 값은 8 바이트 각각이다. scale은 1 바이트이지만 정렬을 위해 패딩되므로 효과적으로 8 바이트까지 차지합니다. 5*8 = 40. 다른 사람이 말했듯이

+0

브릴리언트, 나는 그것을 피하는 방법을 몰랐다. 파일에서 구조체를 읽고 정확한 크기를 가져야합니다. – George

+0

@ 조지 : 바이너리 형식 대신 일반 텍스트로 데이터를 저장하는 것이 일반적입니다. Pragmatic Programmer 책의 Power of Plain Text 섹션을 확인하십시오. – ssegvic

+0

@ssegvic : 감사하지만 파일은 외부 출처에서 제공됩니다. – George

4

, 구조체는 정렬을위한 패딩, 그리고 패딩은 또한 순서가 정의하고있는 회원의에서 타입 구성원의에 따라 달라집니다뿐만 아닙니다.

예를 들어 아래 정의 된대로이 두 구조체를 AB으로 간주하십시오. 두 구조체 모두 구성원 및 유형면에서 동일합니다. 유일한 차이점은 멤버가 정의되는 순서가 동일하지 않습니다이다 :

struct A 
{ 
    int i; 
    int j; 
    char c; 
    char d; 
}; 

struct B 
{ 
    int i; 
    char c; 
    int j; 
    char d; 
}; 

가 동일한 유형의 회원의 같은 번호를했습니다 이유만으로 sizeof(A)sizeof(B) 같겠습니까? 제 각의 크기를 인쇄 해보십시오 :

cout << "sizeof(A) = "<< sizeof(A) << endl; 
cout << "sizeof(B) = "<< sizeof(B) << endl; 

출력 :

sizeof(A) = 12 
sizeof(B) = 16 

깜짝? 출력을 직접 확인하십시오 : http://ideone.com/yCX4S

+2

고맙습니다 - 재미 있습니다. – George