• 15.C语言_字节对齐


    之前学习,在函数内部定义局部变量,或者在函数里面使用参数时;如果局部变量/参数少于四个字节,编译时发现内存仍然是按四个字节来分配处理的。

    为什么编译器要这么做---考虑到执行效率的问题,因为有所谓的本机宽度,CPU处理四个字节处理速度是最快的。所以参数/局部变量小于四个字节,仍然分配四个字节,这是一种牺牲空间来换时间的策略。  除了本机宽度,还有一个概念叫字节对齐,也是一种牺牲空间换时间的策略。

     实验:连续定义两个全局变量,预期变量内存地址是连续的。 假设 char x内存地址是0,则预期int y 地址是1~4.

     实际内存地址是不连续的,68~6C,69/6a/6b浪费了三个。

    变量的内存地址,一定是变量宽度的整数倍。(上图6c一定是4的整数倍)

     结构体起始内存地址,是结构体成员中最宽的数据类型的整数倍。

    之所以有字节对齐,是为了提升程序执行的效率。

     

     

    8,16。

    浪费空间较多,执行效率高。在对内存要求很高的情况下(内存很小),有没有办法改变字节对齐方式?宁愿牺牲执行效率,来节省内存。

     #pragma pack(1)  没法改变结构体的起始位置(结构体中最宽数据的整数倍),但是可以改变结构体成员的对齐方式。

    1,2,4,8(对齐参数) 在对齐时,与结构体成员比较,以较小那个值的整数倍作为结构体成员地址的起始地址。

  • 相关阅读:
    设计模式之动态代理
    设计模式之单例模式
    WinDbg调试高内存的.Net进程Dump
    ping 和 远程桌面 与防火墙的关系
    log4net性能小探
    html页面缓存问题
    casperjs在拆分文件后的中文乱码问题的解决
    casperjs userAgent的一些问题
    浅谈并查集
    当你感到学习困难的时候,你在走上坡路!
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13992229.html
Copyright © 2020-2023  润新知