C语言的字节对齐

目录

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值