2013-07-16 26 views
6

Tôi chỉ muốn biết về các khai báo cấu trúc sau đây. Cái nào tốt hơn để sử dụng để cấp phát bộ nhớ và tại sao? Và những gì về padding trong trường hợp của unsigned char và unsigned int?Trong trường hợp các trường bit, cái nào tốt hơn để sử dụng, unsigned char hoặc unsigned int và tại sao?

struct data{ 
unsigned char a:3; 
unsigned char b:4; 
}; 

struct data{ 
unsigned int a:3; 
unsigned int b:4; 
}; 
+2

Tốt hơn cho những gì? Thời gian, không gian, nhiệt độ, tâm trạng, ...? –

+0

Xem thêm http://stackoverflow.com/questions/3971085/how-does-a-bit-field-work-with-character-types – devnull

+0

@BryanOlivier tốt hơn để cấp phát bộ nhớ – Chinna

Trả lời

7

lĩnh vực Bit cần được khai báo với kiểu signed int, unsigned int. Các loại khác có thể hoặc không được hỗ trợ.

Từ Atmel

in the C Standard, only “unsigned (int)” and “int” are acceptable datatypes for a bitfield member. Some compilers allow “unsigned char” .......

5

Mở chuẩn c99 (§6.7.2.1 # 4)

A-trường bit sẽ có một loại đó là một phiên bản đủ điều kiện hoặc không đủ tiêu chuẩn của _Bool, đã ký int, unsigned int hoặc một số khác loại thực hiện được xác định.

Nếu xác định kiểu thực tế sử dụng là int hay typedef-name định nghĩa là int, sau đó nó được thực hiện xác định liệu các bit-field signed hoặc unsigned.

(§6.7.2.1 # 15)

Có thể có đệm giấu tên ở phần cuối của một cấu trúc hoặc công đoàn.

Việc triển khai có thể phân bổ bất kỳ đơn vị lưu trữ địa chỉ đủ lớn để giữ một bitfield.

Tiếp tục (§6.7.2.1 # 11)

Một tuyên bố bit lĩnh vực không có declarator, nhưng chỉ có một dấu hai chấm và chiều rộng , chỉ một chút trường giấu tên. Như một trường hợp đặc biệt, một thành viên cấu trúc bit trường có chiều rộng bằng 0 cho biết rằng không có trường nào khác được thêm vào trường đơn vị bit trước đó nếu được đặt.

Thành viên cấu trúc trường bit không tên được sử dụng để đệm phù hợp với bố trí ngoài bố cục.

2

Như Amogh (adamantly) và PHIfounder chỉ ra các loại di động hoàn toàn duy nhất là _Bool, signed intunsigned int. Tuy nhiên, rất nhiều trình biên dịch cho phép các kiểu tích phân khác có thể bao quanh bằng cách đóng gói các trường bit. Bit-lĩnh vực trong thực tế thường được sử dụng để đại diện cho đăng ký thiết bị, nơi thường mỗi bit hoặc tập hợp các bit có ý nghĩa riêng của mình. Việc đóng gói các bit được quyết định bởi 6.7.2.1 quảng cáo 11 của tiêu chuẩn C

Việc triển khai có thể phân bổ bất kỳ đơn vị lưu trữ địa chỉ nào đủ lớn để giữ trường bit. Nếu đủ không gian còn lại, một trường bit ngay sau một trường bit khác trong một cấu trúc sẽ được đóng gói thành các bit liền kề của cùng một đơn vị. Nếu không đủ không gian, dù một trường bit không vừa với được đặt vào đơn vị kế tiếp hay chồng chéo các đơn vị lân cận được xác định thực hiện. Thứ tự phân bổ các trường bit trong một đơn vị (thứ tự cao đến thứ tự thấp hoặc thứ tự thấp đến thứ tự cao) được xác định thực hiện. Căn chỉnh của đơn vị lưu trữ địa chỉ không được chỉ định.

Nhiều trình biên dịch đã áp dụng quy ước rằng 'đơn vị lưu trữ địa chỉ' thuộc loại được chỉ định trong nguồn. Trình biên dịch gcc chẳng hạn không cho phép trường bit 9 bit loại unsigned char, nhưng nó cho phép nó cho loại unsigned int. Trong ví dụ của bạn, trình biên dịch gcc cho Pentium cấu trúc sử dụng unsigned char sẽ có kích thước 1 byte, trong khi đó, sử dụng unsigned int sẽ là 4 byte. Nhiều trình biên dịch cũng đã thông qua quy ước rằng nếu một trường bit không vừa, nó sẽ là không trùng lặp với đơn vị tiếp theo. Tuy nhiên điều này có thể được áp dụng sử dụng một chút-field 0 chiều rộng như quyết định bởi 6.7.2.1 quảng cáo 12 của

Một tuyên bố bit lĩnh vực tiêu chuẩn không có declarator, nhưng chỉ có một dấu hai chấm và chiều rộng, chỉ ra một trường bit chưa đặt tên. Như một trường hợp đặc biệt, một thành phần cấu trúc trường bit có chiều rộng bằng 0 chỉ ra rằng không có trường bit nào được thêm vào trong đơn vị mà trường bit trước đó, nếu có, được đặt.

Nếu bạn kết hợp bit lĩnh vực với phi-bit-lĩnh vực sau đó 6.7.2.1 quảng cáo 15 dictates rằng các đơn vị địa chỉ của bit-trường và phi-bit-lĩnh vực sẽ có địa chỉ khác nhau

Trong một đối tượng cấu trúc, các thành viên không thuộc trường bit và các đơn vị trong đó các trường bit nằm ở đó có các địa chỉ tăng theo thứ tự mà chúng được khai báo. Một con trỏ trỏ đến một đối tượng cấu trúc, được chuyển đổi phù hợp, trỏ tới thành viên ban đầu của nó (hoặc nếu thành viên đó là một trường bit, sau đó đến đơn vị mà nó cư trú) và ngược lại. Có thể có đệm không tên trong một đối tượng cấu trúc, nhưng không phải ở đầu của nó.

Một số kiến ​​trúc Ứng dụng Giao diện nhị phân (ABI) của kiến ​​trúc thực thi các lựa chọn được thực hiện để đảm bảo khả năng tương tác của các trình biên dịch khác nhau cho kiến ​​trúc đó.