2010-03-24 32 views
11

Các con trỏ trên hệ thống 64 bit vẫn được căn chỉnh 4 byte (tương tự như một đôi trên hệ thống 32 bit)? Hoặc là họ lưu ý 8 byte liên kết?C Liên kết con trỏ 64 bit

Ví dụ, trên một hệ thống 64-bit lớn như thế nào là cấu trúc dữ liệu sau:

struct a { 
    void* ptr; 
    char myChar; 
} 

có con trỏ 8 byte aligned, khiến 7 byte đệm cho các nhân vật (tổng = 8 + 8 = 16)? Hoặc con trỏ sẽ được 4 byte liên kết (4 byte + 4 byte) gây ra 3 byte đệm (tổng = 4 + 4 + 4 = 12)?

Cảm ơn, Ryan

+7

Trong giây lát, tôi đọc "C64". – Thilo

Trả lời

6

Căn chỉnh và đóng gói dữ liệu được thực hiện cụ thể và có thể thường được thay đổi từ cài đặt trình biên dịch (hoặc thậm chí với pragmas).

Tuy nhiên giả sử bạn đang sử dụng cài đặt mặc định, tối đa (nếu không phải tất cả) trình biên dịch cấu trúc sẽ kết thúc là tổng số 16 byte. Lý do là vì các máy tính đọc một đoạn dữ liệu với kích thước của kích thước từ gốc của nó (đó là 8 byte trong hệ thống 64-bit). Nếu nó được để pad nó để bù đắp 4 byte, cấu trúc tiếp theo sẽ không được đệm đúng đến ranh giới 64-bit. Ví dụ trong trường hợp của một arr [2], phần tử thứ hai của mảng sẽ bắt đầu ở độ lệch 12 byte, mà không phải là ở ranh giới byte gốc của máy.

6

Tôi không nghĩ rằng bạn có thể dựa vào bất kỳ quy tắc cứng và nhanh. Tôi nghĩ rằng đó là một chức năng của trình biên dịch bạn sử dụng và các tùy chọn biên dịch bạn chọn.

Đặt cược tốt nhất của bạn là viết chương trình kiểm tra điều này và kích hoạt tệp tiêu đề để mã hóa các quy tắc căn chỉnh là #define s. Bạn cũng có thể chỉ cần tính toán những gì bạn quan tâm ngay trong các macro, quá.

3

chung trên một hệ thống 64-bit:

struct a { 
    void* ptr;  // size is 8 bytes, alignment is 8 
    char myChar; // size is 1 byte, alignment is 1 
        // padding of 7 bytes so array elements will be properly aligned 
} 

Đối với một tổng kích thước của 16 byte.

Nhưng đây là tất cả việc triển khai được xác định - Tôi chỉ đưa ra một ví dụ có khả năng đúng đối với nhiều hệ thống 64 bit.

0

Bạn cần tham khảo tài liệu cho ABI cụ thể mà bạn quan tâm. Ví dụ: đây là the System V ABI x86-64 architeture supplement - bạn có thể thấy ở trang 12 mà con trỏ trên ABI này được căn chỉnh 8 byte (vì vậy có, cấu trúc bạn hiển thị sẽ được đệm thành 16 byte).

1

Tiêu chuẩn ngôn ngữ không đưa ra tuyên bố về đệm. Các quy tắc căn chỉnh là nền tảng cụ thể (ví dụ, bạn phải căn chỉnh khác nhau trên CPU PowerPC so với CPU x86_64) và chúng được định nghĩa thực hiện, nghĩa là trình biên dịch của bạn có thể thực hiện bất kỳ tác vụ nào (và có thể thay đổi hành vi đó bằng lệnh khác tùy chọn dòng hoặc sau khi cập nhật phiên bản).

Tôi tin tưởng mạnh mẽ rằng khuyến cáo bất kỳ dọc theo dòng của "đây là thường này hay cái kia" là sai lầm, và có thể nguy hiểm.

  1. Bạn có thể viết một chương trình thử nghiệm mà thực hiện một vài sizeof() và/hoặc offsetof() báo cáo và viết một tiêu đề cho bạn có chứa một số #define s nêu rõ miếng đệm không sử dụng.

  2. Bạn có thể sử dụng autoconf để làm điều đó cho bạn.

  3. Ít nhất, bạn nên thêm câu lệnh assert(sizeof(...)) vào đầu chức năng main() để bạn được thông báo khi giả định của bạn sai.

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