当前位置: 首页 > 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://www.xdnf.cn/news/1002367.html

相关文章:

  • 海外广告投放|FB IG 速推帖子有效吗?
  • 2.倒排索引
  • Mitsubishi GX Works3 / GOT3 的惡意工程混淆邏輯注入攻擊
  • Parasoft C++Test软件集成测试(部件测试)_实例讲解
  • C++的学习路径
  • 第一个简单的爬虫
  • 一起了解--CAST函数
  • C++上学抄近路 动态规划算法实现 CCF信息学奥赛C++ 中小学普及组 CSP-J C++算法案例学习
  • Spring Boot 项目中如何划分事务边界,避免长事务?
  • yolo11学习笔记
  • ajax访问阿里云天气接口,获取7天天气
  • C++ 引用
  • get_attribute的使用方法
  • 【小根堆】P9557 [SDCPC 2023] Building Company|普及+
  • Spring Cloud Gateway + OAuth2 + JWT 单点登录(SSO)实现方案
  • Java八股文——MySQL「SQL 基础篇」
  • 随记:sw2urdf插件导出urdf模型在ROS2-rviz2显示
  • 在Vue2项目中引入ElementUI详细步骤
  • Linux系统下安装elasticsearch6.8并配置ik分词
  • 【Java】浅谈ScheduledThreadPoolExecutor
  • Python实战应用-Python实现Web请求与响应
  • 智能合约的浪潮:从区块链到业务自动化的 IT 新引擎
  • 服务器-客户端下kafka的消息处理流程
  • Vue3+PDF.js 实现高性能 PDF 阅读器开发实战
  • C# 动态管理控件和事件,批量查询管理同类控件
  • JavaWeb期末速成 JSP
  • 浅谈DaemonSet
  • PRIMES“中国校准实验室”正式运营,携手东隆科技共筑精准测量新标准
  • 通过同步压缩小波变换实现信号的分解和重构
  • 概率论几大分布的由来