zoukankan      html  css  js  c++  java
  • 字节对齐总结

    1.字节对齐的缘由?

    一句话说就是提高存取效率,存取效率与机器相关,比如有的机器总是从偶数字节开始取数据;同时,存取效率也和数据类型相关,比如如果取一个整型数字时,若能够一次取出来肯定是最好,但是若由于机器取数据总是从偶数字节开始这个原因花了两次访问,那么肯定会降低效率了。

    2.字符对齐中的一些概念?

    • #pragma pack(n):表示显式声明机器的对齐字节为n,我们记这个数字为MA,每个机器都有默认的MA,刚才那句话的意思是改变MA,要恢复系统默认MA,语法是#pragma pack()
    • 有效对齐字节:以结构体为例进行分析,对于结构体中每个成员,它本身字节对齐要求至少得满足起始地址是本身大小的整数倍,但是如果MA小于它本身大小,那么要求对齐数为MA,在任何需要对齐的地方,有效对齐字节=min(MA,数据对齐字节)
    • 什么时候需要对齐?对于结构体,其每一个成员需要对齐,最后整个结构体的大小也需要对齐

    3.对齐的原则(以结构体为例)

    • 对于结构体中每一个元素,对齐大小为min(MA,自身大小)
    • 结构体的首地址必须与min(MA,结构体中最大体积元素大小)对齐,注意不是min(MA,结构体大小)
    • 结构体最终大小需为min(MA,结构体中最大体积大小)对齐
    • C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。即如果不用#pragma pack(n) ,那么相当于n无穷大

    另外二种种说法:

    image

    image

    4.需要注意的是,sizeof函数取的是占用的栈空间,因此static 成员不会计算在内。

    主要参考:1.字节对齐(强制对齐以及自然对齐)  2.对齐实例(包括union)

    PS:这个总结只是为自己总结的,所以我只图自己方便了,所以可能讲得不是很详尽,当然,如果大家看到了有些帮助那做好不过了,如果有些讲得不对的地方,请指出来。

  • 相关阅读:
    Python:如何显示进度条
    Python:常用函数封装
    Javascript:常用函数封装
    Javascript:alert(1)可以这样写以绕过filter
    SQL注入备忘单
    Web渗透:PHP字符编码绕过漏洞总结
    SQLi Lab的视频教程和文字教程
    Python:使用基于事件驱动的SAX解析XML
    Python:渗透测试开源项目【源码值得精读】
    Python:SQLMap源码精读—start函数
  • 原文地址:https://www.cnblogs.com/obama/p/3308623.html
Copyright © 2011-2022 走看看