一文搞懂: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
相关文章
|
C语言 内存技术
C语言—指针读写
主要介绍了如何利用指针实现读写操作。
121 0
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
4月前
|
存储 Unix 编译器
【C语言小知识】缓冲区
【C语言小知识】缓冲区
|
存储 编译器 C语言
初识C语言指针:内存,字节划分,地址存储,简单使用,指针大小
初识C语言指针:内存,字节划分,地址存储,简单使用,指针大小
|
存储 数据库 C语言
C语言中的小知识点(文件操作篇(1))
C语言中的小知识点(文件操作篇(1))
68 0
|
Web App开发 C语言
【C语言】全面解析结构体,结构体知识点整理
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。组成结构型数据的每个数据称为结构型数据的“成员”。结构体通常用来表示类型不同但是又相关的若干数据。
【C语言】全面解析指针,指针知识点整理
对C语言来说,指针是一个难点,如果用C语言来写数据结构的话,掌握指针的用法是必须的,如果指针没学好,学数据结构很吃力。所以希望大家一定要掌握指针啊!!!
|
C语言 C++ 索引
用C语言读取大文件的问题 内存映射
在处理一般的文件(文本/非文本),这些足够了。然而在处理比较大的文件如几十M, 几百M, 甚至上G的文件, 这时再用一般手段处理,系统就显的力不从心了要把文件读出,再写进,耗费的是CPU利用率与内存以及IO的频繁操作。这显然是令用户难以忍受的为了解决这个吃内存,占CPU,以及IO瓶颈,windows核心编程提供了内存映射文件技术(Maping File)
|
存储
结构体字节对齐问题探究
结构体字节对齐问题探究
151 0
结构体字节对齐问题探究
|
数据库 C语言
❤️C语言文件的操作与处理❤️----1.6W字详解,带你搞懂文件操作!!!(下)
想要通讯录的数据能保存,就涉及数据持久化的问题。我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
❤️C语言文件的操作与处理❤️----1.6W字详解,带你搞懂文件操作!!!(下)