2012-04-29 27 views
17

Mã của tôi được sử dụng để làm việc trong quá khứ, nhưng bây giờ kích thước struct đột nhiên là 16 byte. Nó từng là 13 byte. Gần đây tôi đã nâng cấp từ Xcode 4.2 lên Xcode 4.3.1 (4E1019).gói pragma (1) cũng không __attribute__ ((căn chỉnh (1))) hoạt động

#pragma pack(1) 
struct ChunkStruct { 
    uint32_t width; 
    uint32_t height; 
    uint8_t bit_depth; 
    uint8_t color_type; 
    uint8_t compression; 
    uint8_t filter; 
    uint8_t interlace; 
}; 
#pragma pack() 
STATIC_ASSERT(expected_13bytes, sizeof(struct ChunkStruct) == 13); 

Tôi đã cố gắng sử dụng unsuccesfully

#pragma pack(push, 1) 
/* struct ChunkStruct { ... }; */ 
#pragma pack(pop) 

Tôi cũng đã thử những điều sau đây, nhưng không có may mắn

struct ChunkStruct { 
    uint32_t width; 
    uint32_t height; 
    uint8_t bit_depth; 
    uint8_t color_type; 
    uint8_t compression; 
    uint8_t filter; 
    uint8_t interlace; 
} __attribute__ ((aligned (1))); 

Làm thế nào để đóng gói struct với Xcode 4.3.1?

Trả lời

24

Xcode sử dụng các trình biên dịch gccclang cả hai đều sử dụng __attribute__((packed)) để chỉ định cấu trúc đóng gói.

struct foo { 
    uint8_t bar; 
    uint8_t baz; 
} __attribute__((packed)); 

Sử dụng __attribute__((aligned(1))) nói với trình biên dịch để bắt đầu mỗi phần tử struct trên ranh giới byte kế tiếp nhưng không nói với nó bao nhiêu không gian nó có thể đặt ở cuối. Điều này có nghĩa là trình biên dịch được phép làm tròn số struct lên đến bội số của kích thước từ máy để sử dụng tốt hơn trong các mảng và tương tự. __attribute__((packed)) yêu cầu trình biên dịch không sử dụng bất kỳ đệm nào cả, ngay cả ở cuối struct.

Các vấn đề liên quan