`

#pragma pack(1) 的意义是什么

    博客分类:
  • VC++
 
阅读更多

转自:https://blog.csdn.net/xiao156520/article/details/41178805


 设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的。

比如你在C语言中定义下面这样的结构体:

struct s {
char ch;
int i;
};

然后在主函数中写一句:printf("%d", sizeof(struct s))

也就是输出结构体s所占的字节数

你觉得输出结果会是多少呢?

我们知道,char型占用1个字节,int型占4个字节,那么输出的结果是5吗?

答案是否定的。你可以自己试一下,输出结果为8。

为什么会这样呢?这是因为编译器为了让程序跑得跟快,减少CPU读取数据的指令周期,对结构体的存储进行了优化。实际上第一个char型成员虽然本来只有1个字节,但实际上却占用掉了4个字节,为的是让第二个int型成员的地址能够被4整除。因此实际占用的是8个字节。

而#pragma pack(1)让编译器将结构体数据强制连续排列,这样的话,sizeof(struct s)输出的结果就是5了。

 

设置内存对齐为:1字节对齐。使用方法如下:

#pragma pack(n)
struct s {
int i;
char ch;
};
#pragma pack()|

意思就是 以下代码编译出来的是以1个字节的方式对齐的。这样能节约内存资源,但是会在效率上有所影响
   可是,虽说在效率上有一定的影响,不过,如果编写的是基于协议,如串口通讯的程序,那么必须严格按照一定的规则进行接收数据包。那么,只要#pragma pack(1),让数据在内存中是连续的,才好处理的。

 

分享到:
评论

相关推荐

    vc一些东西pragma

    - `#pragma pack(1)`:设置所有数据成员按字节对齐,即不保留任何额外的空隙。 - `#pragma pack(push, n)`:保存当前的对齐设置,并将对齐值设为`n`。常用于局部修改对齐策略,而不会影响后续的对齐设置。 - `#...

    c++ 内存对齐的完整文档

    #pragma pack(1) struct test_t { int a; char b; short c; char d; }; ``` - **成员数据对齐**:`int`类型占用4字节,但按1字节对齐;`char`和`short`类型分别占用1字节和2字节,也都按1字节对齐。 - **整体...

    结构体对齐详解

    3. 结构体的总长度(即对齐模数)是#pragma pack指定的数值、系统默认的对齐模数(如32位系统通常为4字节,64位为8字节)以及结构体内部最大基本数据类型长度中较小的一个。结构体的总长度应为这个对齐模数的整数倍...

    内存对齐详解

    #pragma pack(n) /* n = 1, 2, 4, 8, 16 */ struct test_t { int a; char b; short c; char d; }; #pragma pack() ``` 我们分别使用不同的`#pragma pack`指令来测试不同情况下的对齐情况,并记录`sizeof(struct...

    内存对齐 详细介绍内存对齐的原理

    `#pragma pack(1)`表示禁用对齐,每个成员都紧密排列在一起,而`#pragma pack()`则恢复到编译器默认的行为。 #### 六、结语 内存对齐是计算机系统中一个重要的概念,它直接影响着程序的性能和稳定性。了解内存对齐...

    西南交大:“计算机组成原理A”上机作业四到五次

    在1字节对齐方式下,我们添加了#pragma pack(1)语句来设置结构体的对齐方式。我们可以看到结构体变量X和Y的起始存储地址分别为0x0000001cb14ffaf8和0x0000001cb14ffb28。结构体X所占内存的字节总数为19。通过查看...

    C结构体对齐详解(结构体成员对齐)

    3. 将和 sum_b 向结构体模数对齐,该模数是#pragma pack 指定的数值和结构体内部最大基本数据类型成员长度中数值较小者。 例如,struct my_struct { char a; long double b; }; 在 Windows 和 Linux 中计算方法一样...

    字节对齐的详细解析于实例分析

    - 示例2中,通过`#pragma pack(1)`强制1字节对齐,结构体`test`占用8字节,没有填充。 - 示例3中,使用`__attribute__((packed))`同样实现取消对齐,结构体`test`占用8字节。 5. **深入理解**: - 字节对齐的...

    VS2008 补丁 VS90SP1 KB980263 x86

    标题中的"VS2008 补丁 VS90SP1 KB980263 x86"指的是针对Visual Studio 2008 (VS2008)的一个重要更新,具体为Service Pack 1 (SP1)的补丁KB980263,该补丁适用于32位(x86)系统。这个补丁的主要目的是解决在使用...

    软件开发培训之结构体使用注意事项

    什么是字节对齐** 字节对齐是指数据在内存中的存储位置遵循一定的规则,通常是为了提高内存访问效率而采取的一种措施。 **2. 为什么要求字节对齐** - **硬件原因**:并非所有硬件平台都能有效访问任意地址上的数据...

    字节对齐详解

    4. 预编译指令控制:在C/C++中,我们可以使用预编译指令如#pragma pack(n)来改变默认的对齐规则,n表示新的对齐值。这通常用于优化特定场景下的内存使用,但可能会降低代码的可移植性。 字节对齐的影响因素包括: ...

    超级GCC详尽使用手册

    - `#pragma pack(n)`:设置结构体成员的对齐方式。 - `#pragma GCC diagnostic push/pop`:临时改变诊断信息的行为。 #### 文件 GCC在编译过程中会生成多种类型的文件,包括但不限于: - 源文件:`.c`、`.cpp`等。...

    《你必须知道的495个C语言问题》

    #pragma pack(push, 1) struct packed { char c; short s; int i; }; #pragma pack(pop) ``` **2.11 为什么`sizeof`返回的值大于结构的期望值,是不是尾部有填充?** 是的,`sizeof`返回的值大于预期通常是由于...

Global site tag (gtag.js) - Google Analytics