2010-01-15 57 views
6
  • Bitfield là khái niệm C hoặc C++?Câu hỏi về C bitfields

  • Chỉ được sử dụng trong cấu trúc? Những nơi khác chúng ta có thể sử dụng chúng là gì?

  • AFAIK, bitfield là các biến cấu trúc đặc biệt chỉ chiếm bộ nhớ cho số không được chỉ định. bit. Nó rất hữu ích trong việc tiết kiệm bộ nhớ và không có gì khác. Tôi có đúng không?

Tôi đã mã hóa một chương trình nhỏ để hiểu cách sử dụng bitfields - Nhưng tôi nghĩ nó không hoạt động như mong đợi. Tôi mong đợi kích thước của cấu trúc dưới đây là 1 + 4 + 2 = 7 byte (xem xét kích thước của unsigned int là 4 byte trên máy tính của tôi), Nhưng tôi ngạc nhiên nó hóa ra là 12 byte (4 + 4 + 4). Có ai cho tôi biết tại sao không?

#include <stdio.h> 

struct s{ 
unsigned int a:1; 
unsigned int b; 
unsigned int c:2; 
}; 

int main() 
{ 
    printf("sizeof struct s = %d bytes \n",sizeof(struct s)); 
    return 0; 
} 

OUTPUT:

sizeof struct s = 12 bytes 

Trả lời

10

ac không tiếp giáp, họ từng dành đáng int đầy đủ của không gian bộ nhớ. Nếu bạn di chuyển ac cùng nhau, kích thước của cấu trúc trở thành 8 byte.

Hơn nữa, bạn đang yêu cầu trình biên dịch bạn muốn a chỉ chiếm 1 bit, không phải 1 byte. Vì vậy, mặc dù ac cạnh nhau chỉ chiếm 3 bit tổng (vẫn dưới một byte), kết hợp ac vẫn trở thành từ được căn chỉnh trong bộ nhớ trên máy 32 bit của bạn, do đó chiếm toàn bộ 4 byte ngoài số b.

Tương tự như vậy, bạn sẽ thấy rằng

struct s{ 
unsigned int b; 
short s1; 
short s2; 
}; 

chiếm 8 byte, trong khi

struct s{ 
short s1; 
unsigned int b; 
short s2; 
}; 

chiếm 12 byte bởi vì trong trường hợp sau, hai quần short mỗi ngồi trong sự liên kết 32-bit của mình .

6

1) Chúng có nguồn gốc từ C, nhưng cũng là một phần của C++.

2) Có, hoặc trong một lớp học trong C++.

3) Cũng như lưu bộ nhớ, chúng có thể được sử dụng cho một số dạng bit twiddling. Tuy nhiên, cả hai bộ nhớ tiết kiệm và twiddling đang vốn thực hiện phụ thuộc - nếu bạn muốn viết phần mềm di động, tránh các lĩnh vực bit.

+0

Để trình gỡ xuống - bạn không đồng ý với những tuyên bố này? –

+0

+1: 'phụ thuộc triển khai' và 'tránh bitfield' là chìa khóa. –

+0

Tôi sẽ không đồng ý một phần ở đây liên quan đến tiết kiệm bộ nhớ: vui lòng chỉ định các trường bit mà chúng có thể làm giảm dấu chân bộ nhớ của một cấu trúc. Nhưng đừng bao giờ cố gắng thông minh với họ và bảy lần không bao giờ dựa vào những gì trình biên dịch sẽ làm với họ. – dmckee

0

Số C.

Bộ tiện ích của bạn đã làm tròn cấp phát bộ nhớ đến 12 byte cho mục đích căn chỉnh. Hầu hết các hệ thống bộ nhớ máy tính không thể xử lý địa chỉ byte.

+0

bạn có nghĩa là 'bit địa chỉ', phải không? – SoapBox

0

Chương trình của bạn hoạt động chính xác như tôi mong đợi. Trình biên dịch phân bổ bitfield liền kề vào cùng một từ bộ nhớ, nhưng trình biên dịch của bạn được phân cách bởi một trường không bit.

Di chuyển các bitfields cạnh nhau và bạn có thể sẽ nhận được 8, đó là kích thước của hai ints trên máy tính của bạn. Các bitfields sẽ được đóng gói thành một int. Đây là trình biên dịch cụ thể, tuy nhiên.

Bitfield hữu ích cho việc tiết kiệm dung lượng, nhưng không hữu ích nhiều.

0

Bitfield được sử dụng rộng rãi trong phần mềm để ánh xạ các trường khác nhau trong thanh ghi. Điều này tiết kiệm rất nhiều hoạt động bitwise thủ công mà có thể đã được cần thiết để đọc/ghi các lĩnh vực mà không có nó. Một bất lợi là bạn không thể lấy địa chỉ của bitfields.