您好,登錄后才能下訂單哦!
#include <stdio.h> //gcc ubuntu 32位機 #pragma pack(8) typedef struct m { char a ; long b ; } M; typedef struct n { char a ; char b ; long c ; } N; typedef struct x { char a ; struct m b ; long long c ; } X; typedef struct y { char a ; struct n b ; long long c ; } Y; #pragma pack() #define ADDR(addr) ((unsigned int)(addr)) void main(void) { printf("sizeof(char):%d sizeof(short):%d sizeof(int):%d sizeof(long):%d sizeof(long long):%d\n",\ sizeof(char),sizeof(short),sizeof(int),sizeof(long),sizeof(long long)); printf("sizeof(M):%d sizeof(N):%d sizeof(X):%d sizeof(Y):%d\n",sizeof(M),sizeof(N),sizeof(X),sizeof(Y)) ; M m ; N n ; X x ; Y y ; printf("m.a:%d m.b:%d \n",ADDR(&m.a)-ADDR(&m),ADDR(&m.b)-ADDR(&m)); printf("n.a:%d n.b:%d n.c:%d \n",ADDR(&n.a)-ADDR(&n),ADDR(&n.b)-ADDR(&n),ADDR(&n.c)-ADDR(&n)); printf("x.a:%d x.b.a:%d x.b.b:%d x.c:%d\n",ADDR(&x.a)-ADDR(&x),ADDR(&x.b.a)-ADDR(&x),ADDR(&x.b.b)-ADDR(&x),ADDR(&x.c)-ADDR(&x)); printf("y.a:%d y.b.a:%d y.b.b:%d y.b.c:%d y.c:%d\n",ADDR(&y.a)-ADDR(&y),ADDR(&y.b.a)-ADDR(&y),ADDR(&y.b.b)-ADDR(&y),ADDR(&y.b.c)-ADDR(&y),ADDR(&y.c)-ADDR(&y)); return ; } /* 程序運行結果: sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4 sizeof(long long):8 sizeof(M):8 sizeof(N):8 sizeof(X):20 sizeof(Y):20 m.a:0 m.b:4 n.a:0 n.b:1 n.c:4 x.a:0 x.b.a:4 x.b.b:8 x.c:12//這里的x.c沒有對其到可被8整除的地址上 //系統是按4字節對其的嗎?32位的系統8字節對齊沒有意義? //32位的系統,8字節的數據采用8字節的對齊方式,內存的讀取 //也要讀取多次,對其到8字節浪費空間,且不能加快讀取速度 //因為32為的系統,數據總線是32位,一次最多也就只能取4個 //字節的數據,8字節的數據,對齊到4字節和對齊到8字節是一樣的 //內存的硬件電路決定了,最大也就4字節對齊,大于4字節的對齊是沒有意義的 y.a:0 y.b.a:4 y.b.b:5 y.b.c:8 y.c:12//這里的y.c沒有對其到可被8整除的地址上 */ /* 把#pragma pack(8) 改為 #pragma pack(1) 程序運行結果: sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4 sizeof(long long):8 sizeof(M):5 sizeof(N):6 sizeof(X):14 sizeof(Y):15 m.a:0 m.b:1 n.a:0 n.b:1 n.c:2 x.a:0 x.b.a:1 x.b.b:2 x.c:6 y.a:0 y.b.a:1 y.b.b:2 y.b.c:3 y.c:7 */ /* 把#pragma pack(8) 改為 #pragma pack(4) 程序運行結果: sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4 sizeof(long long):8 sizeof(M):8 sizeof(N):8 sizeof(X):20 sizeof(Y):20 m.a:0 m.b:4 n.a:0 n.b:1 n.c:4 x.a:0 x.b.a:4 x.b.b:8 x.c:12 y.a:0 y.b.a:4 y.b.b:5 y.b.c:8 y.c:12 */
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。