2012-06-04 3 views
1

저는 C++ 구조로 데이터를 압축하려고합니다. (... 0,2,6,10,14 일) :개체가 데이터를 포장하지 않습니다

내 구조체는이 레이아웃이

struct structName 
{ 
    int16_t member1; 
    int32_t member2; 
    uint32_t member3; 
    uint32_t member4; 
    uint32_t member5; 
    etc 
}__attribute__((packed)); 

offsetof($structname, $membername) 내가 다시 데이터의 정확한 오프셋을 얻을 사용을,하지만하여 데이터를 액세스 할 때 member-name 구조체가 압축되지 않은 것처럼 4 바이트 오프셋 (0,4,8,12,16 ...)에서 데이터를 얻습니다.

} __attribute__((packed)); 

는 구조체 포장을 할 수있는 올바른 방법이 있나요? . .

+0

실제 코드를 데이터 구조 –

+0

@ChetSimpson에 게시하는 것이 좋습니다. 구조체 $ structname {...} __ 속성 ​​__ ((packed)); '으로 감싸고 멤버 이름을 추가 하시겠습니까? – mydogisbox

+0

정렬 문제 같습니다. –

답변

6

이 업데이트 : mydogisbox 쓴 :

을 공식적으로, __attribute__((packed)), #pramga pack(1)#pragma pack(push, 1) 모든했다.

__attribute__((packed)) 지원되는 GCC 연장된다.

연타 문서는 또한 #pragma pack(...) 지시어를 지원 말한다 :

그 소리가 마이크로 소프트 비주얼 C++에서 확장에 대한 몇 가지 실험적인 지원을하고있다; 이를 사용하려면 -fms-extensions 명령 행 옵션을 사용하십시오. 이것은 Windows 대상의 기본값입니다. 지원은 불완전합니다. Microsoft 확장 기능을 사용하면 특정 구문 (__declspec 및 Microsoft 스타일 asm 문 포함)이 자동으로 삭제됩니다.

clang은 레코드 레이아웃을 제어하는 ​​Microsoft #pragma pack 기능을 지원합니다.

소스 : http://clang.llvm.org/docs/UsersManual.html

그냥 말 :이 (Windows를 사용하지 않을 경우 -fms-extensions 컴파일) 작동하는 경우

#pragma pack(1) 
struct my_struct { 
    int16_t x; 
    // etc. 
}; 

볼 수 있습니다.

참고 위의 모든 비표준 확장하고, 새로운 C++ 11 표준 새 alignas 키워드가 있습니다 http://en.cppreference.com/w/cpp/language/alignas

struct alignas(1) my_struct { 
    int16_t x; 
    // etc. 
}; 

하지만 지원은 여전히 ​​조금 스케치입니다.

+0

'#pragma pack (1)'과'#pragma pack (push, 1) '에 대해 같은 결과를 얻었습니다. – mydogisbox

+0

에 관련 정보가 더 추가되었습니다. 그게 고칠 수 없다면, 나는 그것이 clang의 버그 일 수 있다고 생각합니다. – QuasarDonkey

+0

어떤 해결책을 사용하셨습니까? pragma pack 또는 alignas? – QuasarDonkey

관련 문제