• C++之修改结构体成员字节对齐(二百一十三)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解C++之修改结构体成员字节对齐

    2.应用实例

    <1>.一般结构体自然对齐

    #include 
    
    typedef struct{
      char a;
      int b;
    } DATA;
    
    int main(void){
      printf("sizeof(DATA)=%ld\n",sizeof(DATA));
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编译 : g++ test.cpp -o test
    运行:./test
    打印:
    sizeof(DATA)=8

    DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。

    1byte1byte1byte1byte1byte
    a(char)1byte填充1byte填充1byte填充1byte
    b(int)1byte1byte1byte1byte

    以4byte对齐,1个char类型占4byte(后三个byte填充)和1个int类型占4byte,,一共8个byte,所以 sizeof(DATA)=6。

    <2>.使用-fpack-struct=2编译选项按照2byte对齐

    
    
    • 1

    编译 : g++ -fpack-struct=2 test.cpp -o test
    运行:./test
    打印:
    sizeof(DATA)=6

    DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。

    1byte1byte1byte1byte1byte
    a(char)1byte填充1byte
    b(int)1byte1byte1byte1byte

    以2byte对齐,1个char类型占2byte(后一个byte填充)和1个int类型占4byte,一共6个byte,所以 sizeof(DATA)=6。

    <3>.使用-fpack-struct编译时,当不指定“n”时,将没有填充字节,所有成员将一个挨着一个排在一起。

    
    
    • 1

    编译 : g++ -fpack-struct test.cpp -o test
    运行:./test
    打印:
    sizeof(DATA)=5

    DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。

    1byte1byte1byte1byte1byte
    a(char)1byte
    b(int)1byte1byte1byte1byte

    1个char类型占1byte和1个int类型占4byte,一共5个byte,中间没有填充字节,一个个挨在一起,所以 sizeof(DATA)=5。

  • 相关阅读:
    【Linux】文件操作
    主键、外键、建表范式、MySQL索引、用户管理
    QT软件开发-基于FFMPEG设计视频播放器-支持流媒体地址播放(五)
    SpringBoot 多模块 多环境 项目 单元测试
    Scratch软件编程等级考试二级——20191221
    股票交易接口list接口索引的方法
    图形学-几何-网格操作
    图像采集和特征提取的技术研究
    未来学习规划 - java篇
    【毕业设计】基于单片机的智能避障超声波跟随小车 - 物联网 嵌入式
  • 原文地址:https://blog.csdn.net/u010164190/article/details/132892073