最近任務完成后,又重新撿起一些基礎書籍看看,彌補一下自己的基礎知識,就遇到一個問題,這里問問明白人。
看到位元組對齊的時候,就自己寫幾個測驗,結果大跌眼鏡:
struct test1 {
char text[2];
long number1;
long long number2;
};
int nsize = sizeof(test1);
結構體test1的大小很好理解,根據位元組對齊的理論,針對char,系統自動填充2個位元組,long大小是4,long long的大小是8,所以test1的大小為16,運行結果跟我設想一致。但是接下來的我就不理解了
struct test2 {
char text[5];
long number1;
long long number2;
};
int nsize = sizeof(test1);
struct test3 {
char text[2];
long long number2;
long number1;
};
int nsize = sizeof(test1);
結構體test2和test3的大小都是24,請問,為什么兩個結構體大小都為24?
uj5u.com熱心網友回復:
元素的起始地址是sizeof(元素型別)的整數倍,結構體大小是最大元素的整數倍。所以
test2
text 5位元組, 空3位元組
number1 4位元組,空4位元組
number2 8位元組
test3
text 2位元組,空6位元組
number2 8位元組
number1 4位元組,空4位元組
uj5u.com熱心網友回復:
那按照這個說,結構test1也應該是24,那為什么是16,就這點不懂
uj5u.com熱心網友回復:
test1 就是你說的啊。
uj5u.com熱心網友回復:
test1 里 2 + 4 = 6 再補2個位元組就對齊到8位元組,所以是 8 + 8 = 16test2 里 5 + 4 = 9 大于8位元組,只能分別對齊到8位元組,所以是 8 + 8 + 8 = 24
uj5u.com熱心網友回復:
僅供參考:#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1 { int a; char b[13]; double c;};
#pragma pack(2)
struct A2 { int a; char b[13]; double c;};
#pragma pack(4)
struct A4 { int a; char b[13]; double c;};
#pragma pack(8)
struct A8 { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
printf("AD.a %d\n",field_offset(AD,a));
printf("AD.b %d\n",field_offset(AD,b));
printf("AD.c %d\n",field_offset(AD,c));
printf("AD sizeof %d\n", sizeof(AD));
printf("\n");
printf("A1.a %d\n",field_offset(A1,a));
printf("A1.b %d\n",field_offset(A1,b));
printf("A1.c %d\n",field_offset(A1,c));
printf("A1 sizeof %d\n", sizeof(A1));
printf("\n");
printf("A2.a %d\n",field_offset(A2,a));
printf("A2.b %d\n",field_offset(A2,b));
printf("A2.c %d\n",field_offset(A2,c));
printf("A2 sizeof %d\n", sizeof(A2));
printf("\n");
printf("A4.a %d\n",field_offset(A4,a));
printf("A4.b %d\n",field_offset(A4,b));
printf("A4.c %d\n",field_offset(A4,c));
printf("A4 sizeof %d\n", sizeof(A4));
printf("\n");
printf("A8.a %d\n",field_offset(A8,a));
printf("A8.b %d\n",field_offset(A8,b));
printf("A8.c %d\n",field_offset(A8,c));
printf("A8 sizeof %d\n", sizeof(A8));
printf("\n");
printf("A16.a %d\n",field_offset(A16,a));
printf("A16.b %d\n",field_offset(A16,b));
printf("A16.c %d\n",field_offset(A16,c));
printf("A16 sizeof %d\n", sizeof(A16));
printf("\n");
return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//AD sizeof 32
//
//A1.a 0
//A1.b 4
//A1.c 17
//A1 sizeof 25
//
//A2.a 0
//A2.b 4
//A2.c 18
//A2 sizeof 26
//
//A4.a 0
//A4.b 4
//A4.c 20
//A4 sizeof 28
//
//A8.a 0
//A8.b 4
//A8.c 24
//A8 sizeof 32
//
//A16.a 0
//A16.b 4
//A16.c 24
//A16 sizeof 32
//
//
uj5u.com熱心網友回復:
size = 最后一個元素的偏移地址+當前長度+對齊長度uj5u.com熱心網友回復:
4樓正解
uj5u.com熱心網友回復:
VC編譯器默認的的結構體對齊是Z8(8位元組)可以用 #pragma pack 定義結構體對齊位元組數
#pragma pack(push, 1) //1位元組對齊
#pragma pack(pop)
uj5u.com熱心網友回復:
struct test2 {
char text[5];
long number1;
long long number2;
};text占0,1,2,3,4五個位元組,下一個成員就從5開始,但是起始地址值需要是長度long number1的整數倍,所以需填充5~7三個位元組,所以從8開始,number1就占了8~11這四個位元組,下一個long long number2就從12開始,但是起始地址值需要是長度的整數倍,所以需填充12_15這四個位元組,所以最后一個成員number2就從16開始,即16~23這八個位元組的長度,因此是24位元組的大小,24是最大成員number2的長度的整數倍,所以最后結構體的sizeof就是24.
struct test3 {
char text[2];
long long number2;
long number1;
};text占0,1兩個位元組,下一個從2開始,但是起始地址值需要是長度long long number2的整數倍,所以需填充2~7六個位元組,所以從8開始,number2就占了8~15這八個位元組,下一個long number1就從16開始,即16~19這四個位元組的長度,因此是20位元組的大小。但是最終結構體的sizeof值必須是最大成員number2長度整數倍,所以最后需要填充20~23四個位元組,即最后結構體的sizeof就是24.
uj5u.com熱心網友回復:
struct test2 {
char text[5];
long number1;
long long number2;
};
text占0,1,2,3,4五個位元組,下一個成員就從5開始,但是起始地址值需要是長度long number1的整數倍,所以需填充5~7三個位元組,所以從8開始,number1就占了8~11這四個位元組,下一個long long number2就從12開始,但是起始地址值需要是長度的整數倍,所以需填充12_15這四個位元組,所以最后一個成員number2就從16開始,即16~23這八個位元組的長度,因此是24位元組的大小,24是最大成員number2的長度的整數倍,所以最后結構體的sizeof就是24.
struct test3 {
char text[2];
long long number2;
long number1;
};
text占0,1兩個位元組,下一個從2開始,但是起始地址值需要是長度long long number2的整數倍,所以需填充2~7六個位元組,所以從8開始,number2就占了8~15這八個位元組,下一個long number1就從16開始,即16~19這四個位元組的長度,因此是20位元組的大小。但是最終結構體的sizeof值必須是最大成員number2長度整數倍,所以最后需要填充20~23四個位元組,即最后結構體的sizeof就是24.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/112523.html
標籤:基礎類
上一篇:為什么有些檔案句柄沒有句柄名?
