关于结构体,内存对齐,sizeof

程序员宝典中,关于结构体对齐问题,看了一晚上帖子,包括内存,CPU等等的,现在总算有些理解

 

要弄清结构体对齐,首先要明白为什么要对齐?

1. 先想想简单的hello.c整个运行过程中外设,内存,CPU的工作过程

    计算机的所有工作都是要经过内存的,包括网页得读取等等

    我们平时说的32位机器是指指令和数据是32位的,可以处理的数据量的增大。64位机时通用寄存器的位数,同时地址编码也是,这样寻址方位就增大。

 

2. CPU在读取内存时,是把内存看成是一块块的,如2,4,8,16个字节的块。

    这样的话,假如把一个Int 类型的数据存储到1地址时候,就要先读出前四个字节,然后再读出四个字节,就需要读出两次,而且对有的处理器来说,根本不支持这种方法。

 

所以,为了提高效率,避免有些不支持多次读取的处理器错误,需要进行内存对齐。

内存对齐跟操作系统,编译器,计算机有关的,一般情况下在VC里默认的对齐方式是#pragma pack(n)

结构对齐方式:1. 对每一个元素的地址,必须是p(取n和sizeof(type)中的较小的值)的倍数

                     2. 整个结构的大小之和,必须是q(取n和各个sizeof(type)中的最大者中的较小者)的倍数------避免结构数组带来的问题

                    

可以指定对齐规则,当指定的对齐规则太大时候,发挥不了作用。

 

最好使用时候指定对齐规则,#pragma pack(push)          指定 #pragma pack(pop)

这样的话避免因为在不同机器系统上读取结构时,因为内存对齐带来的不可移植性。

 

 

参考:英文网站 http://www.ibm.com/developerworks/library/pa-dalign/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值