简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++之修改结构体成员字节对齐
2.应用实例
<1>.一般结构体自然对齐
#include <cstdio>
typedef struct{
char a;
int b;
} DATA;
int main(void){
printf("sizeof(DATA)=%ld\n",sizeof(DATA));
}
编译 : g++ test.cpp -o test
运行:./test
打印:
sizeof(DATA)=8
DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。
1byte | 1byte | 1byte | 1byte | 1byte |
---|---|---|---|---|
a(char) | 1byte | 填充1byte | 填充1byte | 填充1byte |
b(int) | 1byte | 1byte | 1byte | 1byte |
以4byte对齐,1个char类型占4byte(后三个byte填充)和1个int类型占4byte,,一共8个byte,所以 sizeof(DATA)=6。
<2>.使用-fpack-struct=2编译选项按照2byte对齐
编译 : g++ -fpack-struct=2 test.cpp -o test
运行:./test
打印:
sizeof(DATA)=6
DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。
1byte | 1byte | 1byte | 1byte | 1byte |
---|---|---|---|---|
a(char) | 1byte | 填充1byte | ||
b(int) | 1byte | 1byte | 1byte | 1byte |
以2byte对齐,1个char类型占2byte(后一个byte填充)和1个int类型占4byte,一共6个byte,所以 sizeof(DATA)=6。
<3>.使用-fpack-struct编译时,当不指定“n
”时,将没有填充字节,所有成员将一个挨着一个排在一起。
编译 : g++ -fpack-struct test.cpp -o test
运行:./test
打印:
sizeof(DATA)=5
DATA结构体以int类型的4byte对齐,char本来占1个byte,后三个字节为填充字节。
1byte | 1byte | 1byte | 1byte | 1byte |
---|---|---|---|---|
a(char) | 1byte | |||
b(int) | 1byte | 1byte | 1byte | 1byte |