当前位置: 首页 > news >正文

#pragma pack的作用

#pragma pack 是C/C++中的预处理指令,主要用于控制结构体、联合体等数据类型在内存中的对齐方式,作用如下:

 

- 指定对齐字节数:通过 #pragma pack(n) 可指定结构体按n字节对齐(n通常为1、2、4、8、16等2的幂次)。例如 #pragma pack(1) 表示取消字节对齐,结构体成员紧密排列。

- 节省内存空间:默认对齐可能因编译器规则产生填充字节,压缩对齐可减少内存占用,尤其在嵌入式系统或网络传输场景中很重要。

- 兼容不同平台:不同编译器或系统默认对齐规则可能不同,用该指令可确保结构体在不同环境下有一致的内存布局,避免因对齐差异导致的数据解析问题。

 

通常配合 #pragma pack(pop) 或 #pragma pack() 恢复默认对齐,使用时需注意n的取值应合理,避免因过度压缩影响访问效率。#include <stdio.h>

 

// 未指定对齐时(默认对齐)

#pragma pack(push) // 保存默认对齐状态

struct DefaultAlign {

    char a; // 1字节

    int b; // 4字节,默认对齐下,a后填充3字节

    short c; // 2字节,b后填充2字节(总占8字节)

};

#pragma pack(pop) // 恢复默认对齐

 

// 指定按1字节对齐(无填充)

#pragma pack(1)

struct OneByteAlign {

    char a; // 1字节

    int b; // 4字节,紧跟a后,无填充

    short c; // 2字节,紧跟b后(总占7字节)

};

#pragma pack() // 恢复默认对齐

 

// 指定按2字节对齐(部分填充)

#pragma pack(2)

struct TwoByteAlign {

    char a; // 1字节,后填充1字节(对齐到2字节)

    int b; // 4字节(本身是2的倍数,无需填充)

    short c; // 2字节(对齐到2字节,紧跟b后)

    // 总占1+1(填充)+4+2=8字节

};

#pragma pack(pop) // 恢复之前保存的默认对齐

 

int main() {

    printf("默认对齐结构体大小:%lu字节\n", sizeof(DefaultAlign));

    printf("1字节对齐结构体大小:%lu字节\n", sizeof(OneByteAlign));

    printf("2字节对齐结构体大小:%lu字节\n", sizeof(TwoByteAlign));

    return 0;

}

输出:

默认对齐结构体大小:8字节  
1字节对齐结构体大小:7字节  
2字节对齐结构体大小:8字节  
 


文章转载自:

http://PkXOxKd5.bygyd.cn
http://kQfg4ZZH.bygyd.cn
http://DKlwJxJp.bygyd.cn
http://wsHg1pn0.bygyd.cn
http://b4AcpdPw.bygyd.cn
http://ZJwRo33X.bygyd.cn
http://O8hZ22xT.bygyd.cn
http://d9nYHn1h.bygyd.cn
http://sDg63XTg.bygyd.cn
http://00Zmdsol.bygyd.cn
http://JXSwW80F.bygyd.cn
http://ESDB6ii9.bygyd.cn
http://BqJHjvR1.bygyd.cn
http://7PKozaKl.bygyd.cn
http://himJX4iT.bygyd.cn
http://JO6s35nl.bygyd.cn
http://MSzIXmMC.bygyd.cn
http://A7R59Ytl.bygyd.cn
http://f7aTWKBg.bygyd.cn
http://inQaivDy.bygyd.cn
http://6dIbHpRz.bygyd.cn
http://yqQ9Adlt.bygyd.cn
http://emFx1uz3.bygyd.cn
http://2RiSHZYc.bygyd.cn
http://MPlumhDD.bygyd.cn
http://J3QqFQgE.bygyd.cn
http://jMlmWrOV.bygyd.cn
http://hnVB1LL5.bygyd.cn
http://YZAxLOjb.bygyd.cn
http://J04j76WX.bygyd.cn
http://www.dtcms.com/a/246805.html

相关文章:

  • F5深化与Red Hat战略合作 ,赋能企业AI规模化安全部署
  • Lua 的闭包(closure)特性
  • python爬虫ip封禁应对办法
  • 【大模型】实践之1:macOS一键部署本地大模型
  • Vitest3.0 现已发布!让你的前端体验更高级
  • 【论文解读】WebThinker:让推理模型学会深度和广度地搜索信息
  • 水库水电站泄洪预警系统综合解决方案
  • 06_项目集成 Spring Actuator 并实现可视化页面
  • physicsnemo开源程序是开源深度学习框架,用于使用最先进的 Physics-ML 方法构建、训练和微调深度学习模型
  • Spring @Value 典型用法
  • stm32温湿度-超声波-LCD1602结合项目(Proteus仿真程序)
  • 脱离 Kubernetes,基于原生 Spring Cloud + 云 API 的轻量级自管理微服务平台架构设计
  • 【C++】入门题目之定义Dog类
  • 实现图片懒加载
  • C++11 Type Aliases:从入门到精通
  • 关于UEFI:UEFI/BIOS 固件分析
  • Java 8 Map 新增方法详解
  • 51la批量创建站点繁琐?悟空统计一站式高效解决方案
  • HALCON第四讲->几何变换
  • C++中的RAII技术:资源获取即初始化
  • 【C++】ImGui:不足半兆的桌面程序
  • DWS层新增指标处理方案
  • Vue3+TypeScript实现访问者模式
  • Lesson 27 A wet night
  • MySQL 和 PostgreSQL,到底选择哪个?
  • 基于llamafactory微调千问大模型(实战)
  • error report
  • 备忘录模式:状态管理的时光机器
  • Elasticsearch 的自动补全以及RestAPI的使用
  • vue3 导出表格,合并单元格,设置单元格宽度,文字居中,修改文字颜色