C语言的字节对齐

来源:互联网 发布:吾知的小说 编辑:程序博客网 时间:2024/05/21 11:02

目录

      • 目录
    • C语言的字节对齐
      • 结构体和联合体的大小
    • pragma pack

C语言的字节对齐

结构体和联合体的大小

在C编译器缺省情况下的字节对齐方式
 

默认int类型成员的对齐长度为4字节,char为1字节,float为4字节,double类型为8字节对齐

结构体的总大小为结构体最宽字节基本类型成员大小的整数倍,如果有需要,编译器会在最末一个成员之后加上一些填充字节

原则上,共用体的大小取决于占据最多内存的成员的长度。共用体的长度一定可以被最小数据类型整除,也必须至少包含最大成员数据

/** C/C++ 语言** @author Erice_s* @date 2017/10/20**/#include <iostream>using namespace std;union{    char name[62];  // 62    int  age;       //4    double num;     //8} a,b,c;//匿名联合体,只能用a b c 来引用 union m{    double b;     //8    char str[9];  //9};int main(void){    int size = sizeof(a);//64   成员最大为62   但是要整除 1 4 8 ==》 64     printf("sizeof(a)=%d\n",size);    size = sizeof(m);  //16   成员最大为9  但是要整除 8 ==》 16    printf("sizeof(a)=%d\n", size);    return 0;}

运行结果
这里写图片描述

/** C/C++ 语言** @author Erice_s* @date 2017/10/20**/#include <iostream>using namespace std;struct{    char name[62];  // 62    int  age;       //4    double num;     //8} a,b,c;struct m{    double b;     //8    char str[9];  //9};int main(void){    printf("sizeof(a)=%d\n", sizeof(a)); //74 要求能够整除最宽基本类型的成员 double 8  ==》 80    printf("sizeof(m)=%d\n", sizeof(m)); // 8+9=17  同时要能整除8 即最后长度 ==》 24    return 0;}

运行结果
这里写图片描述

#pragma pack

#pragma pack(n)用来指定C编译器编译选项为n字节对齐
#pragma pack()取消自定义字节对齐方式


关于对齐,每个数据成员自身都大小x;并且指定对齐宽带为y,那么该数据的实际对齐大小N=min(x,y),该数据成员的起始地址必须是N的倍数,总长度必须是指定对齐宽度y的倍数。


#pragma pack(2)struct s{  char c; //char为1个字节 N=min(x,y)=min(1,2)=1 内存空间0-0;   int i;  //int 为4个字节 N=min(x,y)=min(4,2)=2 本应该为1-4 但是要求“数据成员的起始地址必须是N的倍数” 所以内存空间2-5  };//占用字节10 1111 ==》6个字节#pragma pack();

此时sizeof(s)=6

#pragma pack(8)struct B{  short c; //short为2个字节 内存空间0-1;   int i;  //int 为4个字节 本应该为2-5  N=min(x,y=min(4,8)=4 但是要求“数据成员的起始地址必须是N的倍数” 所以内存空间4-7  //2-3空间补0  };//占用字节1100 1111 ==》8个字节#pragma pack();

此时sizeof(B)=8

原创粉丝点击