2009-06-19 22 views
6

Tôi tự hỏi tại sao hai loại sau đâyStruct để gõ kích thước

struct { 
    double re[2]; 
}; 

double re[2]; 

có cùng kích thước trong C? Không cấu trúc thêm một chút kích thước trên không?

Trả lời

23

Không, nó chỉ đơn thuần là soạn tất cả các phần tử thành một phần tử cấp cao hơn mà kích thước của nó chỉ đơn thuần là kích thước của các phần tử riêng lẻ (cộng với một số phần đệm phụ thuộc vào quy tắc căn chỉnh, nhưng nằm ngoài phạm vi của câu hỏi này).

+0

1 đề cập đến sự liên kết. –

+1

Đối với hiệu ứng căn chỉnh trong các cấu trúc, xem http://www.unidata.ucar.edu/blogs/default/2009/03/30/1238442300000.html – VolkerK

12

Không nếu nó có thể giúp - không. C tránh trên không như bệnh dịch hạch. Và cụ thể, nó tránh được chi phí trong bối cảnh này.

Nếu bạn sử dụng một cấu trúc khác nhau, bạn có thể thấy một sự khác biệt:

struct space_filled 
{ 
    char  part0; 
    double  part1; 
}; 

Nếu máy tính của bạn đòi hỏi double để được xếp trên một ranh giới 8-byte (và sizeof(double) == 8, đó là bình thường nhưng không bắt buộc của tiêu chuẩn), sau đó bạn sẽ thấy rằng cấu trúc chiếm 16 byte.

+0

Một char & double được khai báo riêng sẽ vẫn chiếm cùng một khoảng trống, vì phần đệm sẽ vẫn ở đó. Nó chỉ là không gian ngăn xếp vô hình. Nhưng bởi các địa chỉ của các mục sẽ tiết lộ padding. – abelenky

+0

Không nhất thiết - nếu có một char khác, hoặc ngắn hoặc int, hoặc một trong mỗi chuỗi (theo giả định kích thước tương đối bình thường), thì sẽ không có không gian. Nhưng trong trường hợp không có các biến 'filler' như vậy, bạn đã đúng. (Và tôi không nghĩ tiêu chuẩn C đảm bảo rằng các biến cục bộ sẽ được đặt ra theo bất kỳ thứ tự cụ thể nào liên quan đến nhau.) –

+1

@ Jonathan: Tôi chắc chắn là không, vì vậy trình biên dịch có thể tự động đặt hàng nó thích tiết kiệm không gian, nếu nó muốn. Trong thực tế, miễn là một con trỏ đến tự động không rời khỏi phạm vi địa phương, tôi không nghĩ rằng tự động cần phải được trên stack ở tất cả - trình biên dịch có thể giữ chúng trong sổ đăng ký nếu nó thích. Tôi nghĩ. –

3

số Struct không thêm bất kỳ kích thước, hoặc có bất cứ chi phí trong biên soạn C.

Nó là một lớp cú pháp đòi hỏi công việc bổ sung bởi trình biên dịch, nhưng không có chi phí khi chạy.

C là ngôn ngữ cực kỳ "khỏa thân", có nghĩa là không có gì ở đó trừ khi được yêu cầu. Vì vậy, hãy tự hỏi, "Chi phí cho cấu trúc REQUIRE là gì?" Và bạn sẽ không tìm thấy bất kỳ giá nào.

2

Không, không.

Đó là một trong những điểm tốt của cấu trúc (tại sao chúng lại hữu ích trong lập trình TCP/IP cũ).

Đó là cách hay để thể hiện bố cục bộ nhớ/bộ đệm.

0

không có loại cấu trúc trong C chỉ cần sắp xếp bố cục các thành viên trong bộ nhớ

5

Không, cấu trúc không phải thêm bất kỳ thứ gì. Không giống như trong Java hoặc .NET, nơi các lớp (và cấu trúc) có một loạt các trách nhiệm khác, trong C và C++, chúng đơn giản là các thùng chứa được sử dụng để chứa một số thành viên dữ liệu. Trong C++, chúng có thể phải lưu trữ một vtable để giải quyết các cuộc gọi hàm ảo nếu có, nhưng nói chung, không, bản thân struct không có phí.

Một ngoại lệ là thế này:

typedef struct {} empty; 
assert(sizeof(empty) > 0); 

Kích thước của một struct có sản phẩm nào sẽ không là zero. Cấu trúc phải có một số kích thước không phải là vì mọi đối tượng phải có một địa chỉ duy nhất. (Nếu không, bạn sẽ không thể tạo ra một mảng các cấu trúc)

+1

+1 để đề cập đến cấu trúc trống. –

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