2014-07-22 5 views
1

64 비트 32 비트 창에 g ++를 사용하여 구조체를 패킹하려고합니다.C/C++ struct 패킹이 작동하지 않습니다.

struct Foo 
{ 
    uint8_t a; 
    uint32_t b; 
} __attribute__((packed)); 


int main(int argc, char *argv[]) 
{ 
    qDebug() << "sizeof(Foo):" << sizeof(Foo); 
    return 0; 
} 

이 내가 해봤 8. 기타 물건 출력 :

{ uint8_t a; } // Gives 1, correct. 
{ uint8_t a; float b; } // Gives 8, expected 5. 
{ uint8_t a; uint16_t b; } // Gives 4, expected 3. 
{ uint16_t a; uint8_t b; uint8_t c; } // Gives 4, correct. 

그래서이 구조체는 포장처럼 보이지만 sizeof 어떤 경우에는 반올림? (사실이 질문을 작성한 후에 나는 대답 할 수 있다고 생각하지만 후일을 위해 그것을 게시 할 것입니다.)

편집 : 사실 저는 잘 모릅니다. 나는 aligned(1)가 그것을 고칠 것이라고 생각했지만 그렇지 않았습니다.

+0

, 진행 : 3,516,는

표준 입력

표준 출력 사본

를 sizeof (푸)이 비어 복사합니다. – chris

+1

@Timmmm 코딩 할 경우'#pragma pack (1)'을 사용하십시오. – Sathish

+0

만약 당신이 그들을 더 작게 구조체에 마지막 작은 유형을 넣어보십시오. –

답변

2

마지막으로 발견 된 것은 a bug in g++입니다.

일반적인 문제는 ((__packed)) 만 구조체의 마지막 필드에 적용되는 속성이다. 이것은 크기 9의 원인입니다. 트릭은 여기에 '#pragma pack (1)'입니다. 그것에 의하여 당신은 예상 된 크기를 얻습니다. 문제는 이며, 이라고 표시된 구조체/공용체가 패킹 되어도 (또는 -fpack-struct 옵션을 통해)이 필드 정렬이 적용된다는 점입니다.

그럼 그 설명의 일부 의심의 여지가있을 것 같다,하지만이 솔루션은 작동 - 같이 대신 #pragma pack(1)를 사용

#pragma pack(1) 

struct Foo 
{ 
    uint8_t a; 
    uint32_t b; 
}; 

#pragma pack() 

두 번째 #pragma는 팩 값을 다시 설정합니다.

+1

이것은 (분명히) g ++ 4.7부터 MinGW까지의 버그입니다. 나는 g ++ 4.6.2로 정확한 크기를 가지고 있었고, 방금 4.8.1로 업그레이드했고 지금은 잘못된 크기를 얻었습니다. – Holt

+1

업스트림 gcc 버그 참조 : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 – benjarobin

0

포장 된 경우, 5 일에 나를 위해 작동해야

리눅스 버전 3.13.0-32 제네릭 (인 buildd @ kissel) (GCC 버전 4.8.2 (우분투 4.8.2-19ubuntu1)) # 57 - 우분투 SMP (화) 7월 15일 세계 협정시 03시 51분 8초 2014

#include <iostream> 
using namespace std; 

struct Foo 
{ 
unsigned char a; 
unsigned int b; 
} __attribute__((packed)); 


int main(int argc, char *argv[]) 
{ 
cout << "sizeof(Foo):" << sizeof(Foo); 
return 0; 
} 

성공 댓글 (0) 표준 입력 012 당신이 그것을 대답 할 수 있다면 5

Compiled on Ideone