
正文
c语言结构体要数据对齐,c语言结构体数据输入
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求助关于C语言结构体对齐的问题
对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。
如果多个这样的结构在内存中顺着摆放,则许多结构的起始地址将不在边界处。因此,编译程序总是会将每个结构的尾部都加入一些必要的空白,将其凑成32的整数倍。这就是边界对齐的基本道理。
首先你要知道为什么会出现字节对齐,这是一种用空间换时间的做法,因为对齐之后可以提高取数的效率。结构体的大小一般是4或者8的倍数,具体是以最大的变量类型的大小为基数的。
A 是对的 ,结构体有对齐和补齐,占的字节数与自己定义有关,还与编译器有关,不同环境编译器确实不同。B 错误,在c语言中,枚举是由程序员自己声明的一种类型,属于构造类型,不是基本类型。
有虚函数的话就有虚表,虚表保存虚函数地址,一个地址占用的长度根据编译器不同有可能不同,vs里面是8个字节,在devc++里面是4个字节。
相关问答
Q1: 结构体内存对齐
CGPoint在OC中是一个结构体,结构体一般采用内存对齐的方式分配。 结构体每个成员相对于结构体首地址的偏移量都是这个成员大小的整数倍,如果有需要,编译器会在成员之间加上填充字节。
结构体 struct2 填充到 29 就结束了,但是结构体需满足 内存对齐 原则。所以为其 扩容(30,31) 总共占 12字节 ,其最大成员的 整数倍数 ,所以 short 从 32 开始填充。内存为 40字节 。
内存对齐是一种在计算机内存中排列数据(表现为变量的地址) 、访问数据(表现为CPU读取数据)的一种方式。 内存对齐包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 。
对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”。“内存对齐”应该是编译器的 “管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。
根据规则 2,可得出对齐值为 8。现在的偏移量为 25,不是 8 的整倍数。因此确定偏移量为 32。
Q2: 什么是C语言结构体字节对齐,为什么要对齐
arm支持16bit和32bit的地址访问,即变量地址能够被2或4整除,这时性能比较好,也便于移植。
性能原因:数据结构(尤其是栈)应该尽可能在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,而对齐的内存访问仅需要一次访问。
字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节。字节按照一定规则在空间上排列就是字节对齐。
结构体所占的内存空间在理论上是等于它所包含的所有数据元素的,但在实际操作中像vc++0和c++bulider默认的都是8字节对齐,所以导致二者所占内存空间不一致。你可以在setting选项中将字节对齐方式设置为1字节对齐。
struct 前面的字段要对后面数据的 地址编号 的负责, 如果大于char了。 short 必须是2的倍数。 int 是4的倍数 double 是8的倍数。最后一个字段对下个结构体 开头位置负责。
Q3: C语言结构体长度字节对齐问题
1、大于1个字节的时候,需要注意对齐粒度了。禁止让一个多字节数据跨粒度了。 struct 前面的字段要对后面数据的 地址编号 的负责, 如果大于char了。 short 必须是2的倍数。 int 是4的倍数 double 是8的倍数。
2、需要字节对齐的根本原因在于CPU访问数据的效率问题。
3、结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。
4、这还属于乐观情况(性能原因),还有平台的移植原因,因为只有部分CPU肯干,其他部分CPU遇到未对齐边界就直接罢工了 字节对齐:第一个成员在与结构体变量偏移量(offset)为0的地址处。
5、结构体所占的内存空间在理论上是等于它所包含的所有数据元素的,但在实际操作中像vc++0和c++bulider默认的都是8字节对齐,所以导致二者所占内存空间不一致。你可以在setting选项中将字节对齐方式设置为1字节对齐。
c语言结构体要数据对齐的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言结构体数据输入、c语言结构体要数据对齐的信息别忘了在本站进行查找喔。






