C语言中#pragma pack(1)的用法与注意点
微黄
楼主
发布于 2023-4-19 13:43:18
阅读 942
查看全部
目录
一:何时使用二. 为什么使用#pragma pack(1)三.注意点四.#pragma pack()的一些用法五.题目附:C语言慎用#pragma pack(1)命令总结
一:何时使用
#pragma pack(1)的用法大多是用在构造体中
二. 为什么使用#pragma pack(1)
构造体的字节对齐方式在不同的编译器中不同,会存在数据冗余,以下举个例子- struct example
- {
- char header_start;
- double data_type;
- };
复制代码 现有的构造体,就会依照构造体成员中最大的数据类型对齐,例子当中就是double型,依照8个字节停止对齐。那么此时sizeof(example)就是16,存在7个空字节,因为其中char只占一个字节
假设加上#pragma pack(1),那么example按1个字节对齐方式对齐,此时sizeof(example)就是等于9
三.注意点
这种方法的使用一定要是成对使用,如下面例子- #pragma pack(1)
- struct example
- {
- char header_start;
- double data_type;
- };
- #pragma pack()
复制代码 我们一定要在构造体末尾加上#pragma pack()停止取消自定义字节对齐的命令,假设不取消,可能会导致整个程序存在问题。因为会影响到其他的构造体对齐方式
四.#pragma pack()的一些用法
#pragma pack(show) //显示当前内存对齐的字节数,编辑器默认8字节对齐
#pragma pack(n) //设置编辑器依照n个字节对齐,n可以取值1,2,4,8,16
#pragma pack(push) //将当前的对齐字节数压入栈顶,不改变对齐字节数
#pragma pack(push,n) //将当前的对齐字节数压入栈顶,并依照n字节对齐
#pragma pack(pop) //弹出栈顶对齐字节数,不改变对齐字节数
#pragma pack(pop,n) //弹出栈顶并直接丢弃,依照n字节对齐
五.题目
牛牛需要建立一个构造体Nowcoder,该构造体包括三个成员,其类型分别是int、double和char。假设牛牛想让这个构造体所占据的内存最小,请问你该怎么建立该构造体?(输入三个相应类型的变量用于初始化构造体)
示例1
输入:1,1.000,a
返回值:13 代码- /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- *
- * @param n int整型
- * @param d double浮点型
- * @param c char字符型
- * @return int整型
- */
- #pragma pack(1)
- struct Nowcoder{
- char c;
- int n;
- double d;
- };
- int smaller_space(int n, double d, char c ) {
- // write code here
- struct Nowcoder temp;
- temp.c=c;
- temp.n=n;
- temp.d=d;
- return sizeof(temp);
- }
复制代码 附:C语言慎用#pragma pack(1)命令
在我们在按字节传输一些数据的时候,肯定会定义一些构造体,但是构造体的字节对齐方式可能在不同的编译器中不一样,这样会在数据传输过程中增加冗余的数据。
为了方便数据传输,我们可以用#pragma pack(1)命令,将构造体里的变量强迫停止1字节对齐,但是我们在用完这个命令后,一定要在定义的数个构造体后加一个取消自定义字节对齐的命令:#pragma pack(),假设不取消就可能导致整个程序都会有问题,因为这个命令会影响到其它的构造体的字节对齐方式,但并不会全部全部影响(推测)。正确用法是:- #pragma pack(1)
- typedef struct
- {
- .......
- } xxxxx;
- typedef struct
- {
- .......
- } xxxxx;
- ........
- #pragma pack()
复制代码 总结
到此这篇关于C语言中#pragma pack(1)的用法与注意点的文章就介绍到这了,更多相关C语言#pragma pack(1)用法内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站! |
|
|
|
|