一文搞懂:XTF文件读取时字节对齐问题

简介: 一文搞懂:XTF文件读取时字节对齐问题

"

  在使用VS编写XTF文件读取程序的结构体部分时,要使用#pragma pack(1)与#pragma pack()设置字节对齐方式,否则读取得到的数据显示不正确

但#pragma pack(1)是什么?

#pragma pack 是字节对齐方式,对于#pragma pack(1):

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

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

  struct s {

  char ch;

  int i;

  };

  然后在主函数中写一句:printf(""%d"", sizeof(struct //代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1MjEyNA==.html

s))

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

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

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

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

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

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

而对于#pragma pack(n):

  程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。

  编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1MjE0MA==.html

字节数,那么偏移量

  必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大

  于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。


"
image.png
相关文章
|
定位技术 TensorFlow API
Google Earth Engine (GEE)——张量流水灾模型数据集(Sentinel-1)
Google Earth Engine (GEE)——张量流水灾模型数据集(Sentinel-1)
409 0
|
机器学习/深度学习 算法 数据挖掘
使用NetworkX绘制深度神经网络结构图(Python)
使用NetworkX绘制深度神经网络结构图(Python)
使用NetworkX绘制深度神经网络结构图(Python)
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
845 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
机器学习/深度学习 并行计算 安全
ImportError: DLL load failed while importing libpaddle: 找不到指定的模块。问题处理
【5月更文挑战第12天】ImportError: DLL load failed while importing libpaddle: 找不到指定的模块。问题处理
3367 0
|
分布式计算 Hadoop Linux
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
Linux报错:mkdir:无法创建目录“/opt/apps/xxx/logs“: Permission denied
973 0
|
Java 编译器 C语言
【C/C++】 switch-case 详解/全面总结
关于 C语言/C++ 中,switch-case 的尽量详细和全面的解释与总结
4136 0
|
并行计算 PyTorch Linux
【Pytorch】解决cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
本文提供了在使用PyTorch时遇到cuDNN error: CUDNN_STATUS_NOT_INITIALIZED错误的几种解决方法,包括重新安装PyTorch及其相关库以确保版本兼容,检查CUDA与显卡驱动的对应关系,以及在无法使用GPU的情况下切换到CPU运行模型。
1800 2
|
关系型数据库 MySQL Linux
docker镜像与容器的迁移
docker迁移镜像步骤 docker迁移容器步骤 docker迁移mysql容器步骤
1711 1
|
编译器 程序员 C++
【C++】语法小课堂 --- auto关键字 & typeid查看实际类型 & 范围for循环 & 空指针nullptr(二)
【C++】语法小课堂 --- auto关键字 & typeid查看实际类型 & 范围for循环 & 空指针nullptr(二)
222 0