嵌入式每日八股2.10

常见字节对齐类型

1、逐段对齐

typedef struct stu
{
    char sex;  //1
    short num; //2
    int age;   //4
}stu;	
// 1+2=3补1 + 4 =8(是最大4的倍数)
//4(1+2+padding)+4 = 8bytes
typedef struct stu
{
    char sex;  //1
    int age;   //4
    short num; //2
}stu;	
//1补3 + 4 + 2补2 =12(是最大4的倍数)  
//4(1+padding)+4+4(2+padding) = 12bytes

2、带位数指定的逐段对齐

例1

struct A   
{         
     char t : 4;        // 4位         
     char k : 4;        // 4位         
     unsigned short i : 8;  // 8位               
     unsigned long m;       // 4字节  
}; 
//根据结构体内存对齐原则,共占用8字节。
//0.5+0.5+1=2补2=4+4=8
//4(0.5+0.5+1+padding)+4 = 8bytes

例2

struct s
{
    int i: 8; //占int型里的8位
    int j: 4; //占int型里的4位,前两个一起可以占4个字节,再补4字节
    double b; //8字节,最大,其他的向他看齐,不让他跨越空间,读的时候一下就读出来了
    int a:3;  //3位,可以用4个字节,再补4个字节
}; //4补4 +  8 + 4补4  = 24 逐段对齐 
printf("sizeof(s)= %d\n", sizeof(struct s));

//8(i+j+padding)+8(b)+4(a+padding)+4(padding) = 24 bytes
//这种带位数指定的逐段对齐的写法是原来单片机中方便操作寄存器使用的。

3、#pragma pack (value)时指定的对齐

#pragma pack(1)  
struct fun  
{  
    int i;     // 4字节  
    double d;  // 8字节  
    char c;    // 1字节  
}; 
//sizeof(fun)得到的结果是13。
//因为预处理语句 ”#prama pack(1)” 将编译器的字节对齐数改为1了,根据结构体内存对齐原则,该结构体占用的字节数为13。

4、带联合体的对齐

例1

typedef struct stu
{
   int num;       //4
   char name[30]; //30  
   char job;      //1   后面都是8,前面全配成8的倍数就行>35的就40个字节了
   double sex;	  //8
   union    //只分配最大元素的空间(8)
   {
     int grade;	    //4
     double d;		//8   类型最大值
   }gorp;
}stu; 
//8(4+padding)+32(30+1+padding)+8+8 = 56 bytes

例2

typedef union
{
   long i;   //8
   int k[5]; //20
   char c;   //1
} DATE;  

struct data
{
   int cat;    //4
   DATE cow;   //这里是20,但是按DATA元素的最大对齐,即struct data按8字节对齐
   double dog; //8
} too;
  
DATE max; 

则语句 printf("%d",sizeof(struct data)+sizeof(max));的执行结果是___,

解答

typedef union //最大元素空间 为20
{
    long i;   //8
    int k[5]; //4*5=20
    char c;   //1
} DATE;  

struct data
{
    int cat;    //4
    DATE cow;   //20    里面虽然有long,但是对外是20字节int的数据
    double dog; //8   看这个类型的整数倍
} too;   
DATE max; //20

//4+20(刚好是8的倍数,前面的两个都不用各自补齐)+8 = 32 bytes
//则语句 printf("%d",sizeof(struct data)+sizeof(max));的执行结果是32+20=52。

【嵌入式八股】精华版(免费216问精华八股) https://www.nowcoder.com/creation/manager/columnDetail/0rOeJm

【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM

【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym

【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM

【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务