关于结构体字节对齐的一些感悟

来源:互联网 发布:windows自带的录音机 编辑:程序博客网 时间:2024/06/10 02:54

和之前的一篇文章相对应《关于结构体长度的计算——环境DEV-c++5.1.1》,在看书的时候有了更近一步的理解,欢迎相互探讨。

明确几个知识点:

1、sizeof()

     1.1、sizeof()不是一个函数,而是一个操作符,功能为返回一个对象或类型

              所占用的内存的大小。

     1.2、sizeof在计算对象占用内存大小时也转换成对对象类型的计算

     1.3、可以对一个表达式求值,根据表达式的最终结果类型确定大小,但是一般不会                对表达式进行计算,当表达式为函数时,并不执行函数体。

2、可利用offsetof来查看结构体中各个成员的偏移地址和结构体所占内存的大小。             (在下篇文章中具体讲解)


① 编译器默认按照结构中占有内存最大的类型所占用的字节数进行字节对齐;


② 默认情况下,编译器规定各个成员变量的起始地址先对于结构的起始地址的偏移量,必须为该变量的类型所占用字节数和编译器编译过程中采用的字节对齐数两者中最小值的整数倍。(可通过#pragma pack (N)设置N字节对齐)


③在有嵌套结构体的情况下,要分解出各个“最小类型”进行分析。


④编译器在处理的过程中所取得的字节对齐方式是指定的字节对齐数和默认字节对齐数两者中的最小值。


⑤偏移过程中编译器自动填充的数据是完全无用的。


①③④是重点,另外,在实际操作的过程中,不同的编译环境结果不同,我在64位win10 用Virtu Box安装32位linux虚拟机 发现不少问题,上面提到的基本上都实现不了0.0……但是用DEV-C++却没什么问题,编译器应该都是gcc,搞不懂为什么会有这么大差别,初步猜测是虚拟机的锅,因为以前写关于内存寻址的代码时,在虚拟机下乱七八糟,但是在真正的linux系统中却没有问题,我这个菜鸟啊……

欢迎探讨。


16.12.1

D

0 0