Đây là liên kết bộ nhớ. Trong mã dưới đây, tôi dự kiến rằng bù đắp của b bên trong cấu trúc là 8 (32-bit máy). Xem here. Có, làm cho b
luôn xảy ra trong một dòng bộ nhớ cache. Tuy nhiên, đó không phải là trường hợp. Thành viên b
trong một đối tượng toàn cầu là struct test1
dường như được căn chỉnh. Tôi không chắc chắn nếu nó của cơ hội hoặc trình biên dịch đang làm điều này cố ý.Tại sao thành viên kép trong cấu trúc không được căn chỉnh trên ranh giới 8 byte?
Tôi muốn hiểu tại sao trình biên dịch không được đệm 4 byte sau a
.
struct test1
{
int a;
double b;
}t1;
int main()
{
struct test1 *p = malloc(sizeof(struct test1));
printf("sizes int %d, float %d, double %d, long double %d\n", sizeof(int), sizeof(float), sizeof(double), sizeof(long double));
printf("offset of b %d\n",(int)&(t1.b)-(int)&(t1));
printf("\naddress of b (on heap) = %p, addr of b (on data seg) = %p\n",&(p->b), &(t1.b));
return 0;
}
Đầu ra là ...
sizes int 4, float 4, double 8, long double 12
offset of b 4
address of b (on heap) = 0x804a07c, addr of b (on data seg) = 0x80497e0
Tôi đang sử dụng trình biên dịch gcc tiêu chuẩn trên ubuntu 10.04
Đối với một điều, nếu CPU có thể đối phó với toán hạng lệch, không có vấn đề . Bây giờ, tại sao trình biên dịch của bạn là cấu trúc đóng gói chặt chẽ, là một câu hỏi. Bạn biên dịch mã như thế nào?Có bất kỳ tùy chọn biên dịch ẩn đến từ makefiles hoặc bất cứ trình biên dịch có thể được kéo từ các tập tin cấu hình của nó? –
@ Alexey, không, chỉ là testC gcc của nó; ./a.out – Chethan
Tôi nhận được kết quả tương tự khi biên dịch với gcc 4.6.3 bằng cách sử dụng tùy chọn "mặc định" và -m32 (Tôi có hệ điều hành 64 bit, do đó mặc định là 64 bit và trong trường hợp đó, mang lại cho tôi sự liên kết 8 byte). –