zoukankan      html  css  js  c++  java
  • 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(对齐参数) 在对齐时,与结构体成员比较,以较小那个值的整数倍作为结构体成员地址的起始地址。

  • 相关阅读:
    hdu 2147博弈找规律
    hdu 1851 巴什博弈
    hdu 1729 sg博弈
    hdu 2516博弈找规律
    (转载)博弈之SG函数
    poj 2234基础Nim博弈||sg博弈
    hdu 1730 sg博弈||nim博弈
    hdu 1847 博弈找规律
    n hdu 1760 [SG博弈]二维状态
    hdu 1849 nim博弈
  • 原文地址:https://www.cnblogs.com/RevelationTruth/p/13992229.html
Copyright © 2011-2022 走看看