user-0 提问: 结构体字节长度计算

回复:
user: user-1
content: 仅供参考：#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("\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("\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("\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("\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("\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("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-2
content: 在结构体中，结构体的长度等于所有类型长度的合计， 并且必须等于其中占用内存长度最大的成员项的整数倍。  #include "stdio.h" struct adeal{  int a;  char *d; }; struct adeal2{   int a; };   struct adeal3{   char *d; };   struct adeal4{   short int a;   char  d;  };   int main(){   int a1;   short int a1_;   unsigned  int a2;   long int a3;   unsigned long int a4;   float a5;   double a6;   char a7;   char *a8=&a6;   struct adeal a9;   struct adeal2 a10;   struct adeal3 a11;    struct adeal4 a12;      printf("整型长度:%d\n",sizeof(a1));   printf("短整型长度:%d\n",sizeof(a1_));   printf("无符号整型长度:%d\n",sizeof(a2));   printf("长整型长度:%d\n",sizeof(a3));    printf("无符号长整型长度:%d\n",sizeof(a4));   printf("浮点型长度:%d\n",sizeof(a5));    printf("双精度长度:%d\n",sizeof(a6));   printf("字符型长度:%d\n",sizeof(a7));   printf("字符型指针长度:%d\n",sizeof(a8));   printf("结构的长度:%d\n",sizeof(a9));   printf("结构的长度:%d\n",sizeof(a10));   printf("结构的长度:%d\n",sizeof(a11));   printf("结构的长度:%d\n",sizeof(a12));   return 1; }  参阅sizeof用法   <a href="http://www.maomao365.com/?p=2809" target="_blank">http://www.maomao365.com/?p=2809</a>

user: user-3
content: 结构对齐，简单的说就是取int的倍数。昨天刚学的，解释不好大神不要见怪。

user: user-4
content: 结构体对齐的问题

user: user-5
content: 引用 4 楼 walkiz 的回复:结构体会有字节对齐问题，如果你想让它紧凑的排列，那么可以这样：  #pragma pack(push, 1) struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1; #pragma pack(pop)   [quote=引用 楼主 a904235765 的回复:] 定义一个如下的结构体： struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1;  int  a; a=sizeof(test1);  请问a的数值怎么是16，不是4+1+3*2+4=15么？？[/quote]  请教一下，一般情况都是结构体字节对齐，在什么情况下使用这种字节紧凑排列呢？？？？

user: user-6
content: 结构体对齐方面的知识

user: user-7
content: 比如你用结构体去读取一个文件头，不紧凑的话中间会有很多字段对应不上。  引用 5 楼 adusuccessfully 的回复:[quote=引用 4 楼 walkiz 的回复:] 结构体会有字节对齐问题，如果你想让它紧凑的排列，那么可以这样：  #pragma pack(push, 1) struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1; #pragma pack(pop)   [quote=引用 楼主 a904235765 的回复:] 定义一个如下的结构体： struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1;  int  a; a=sizeof(test1);  请问a的数值怎么是16，不是4+1+3*2+4=15么？？[/quote]  请教一下，一般情况都是结构体字节对齐，在什么情况下使用这种字节紧凑排列呢？？？？[/quote]

user: user-7
content: 结构体会有字节对齐问题，如果你想让它紧凑的排列，那么可以这样：  #pragma pack(push, 1) struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1; #pragma pack(pop)  引用 楼主 a904235765 的回复:定义一个如下的结构体： struct node{ 	int a; 	char b;     unsigned short k[3];     unsigned int q; }test1;  int  a; a=sizeof(test1);  请问a的数值怎么是16，不是4+1+3*2+4=15么？？

user: user-8
content: 使用sizeof获取类型的字节大小，至于字节对齐问题，知道即可。

user: user-9
content: CPU访问内存的时候，对访问地址有对齐的要求，一般为2的幂次方。 所以有的数据结构被自动填充，以满足对齐要求。

user: user-10
content: 字节对齐，自动填充成2的幂次方数，这样计算机操作数据会更加快