zoukankan      html  css  js  c++  java
  • 内存对齐

    1、内存对齐原因

    • 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
    • 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
    2、内存对齐后大小的计算(sizeof(int)=4,sizeof(char)=1,sizeof(float)=4,sizeof(double)=8)
    • 针对结构体

        

    #include <stdio.h>
    struct MyStruct
    {
       char da;
       double dda;
       int type[3];
    };
    
    int main(void)
    {
       int leng=sizeof(struct MyStruct);
       printf("%d",leng);
       return 0;
    }

      结果为32;

    解析:在结构体MyStruct中,基本类型长度最长的是double,为8个字节。所以以8个字节为标准进行对齐,则该结构体的变量所存储的位置应该为

    .。。。。。。。(char)

    ........(double)

    ........(type[0]type[1])

    ....。。。。(type[2])

    其中。是表示为了对齐所补上的字节。

    如果结构体中的double类型改为int类型,即结构体中的数据类型最长的长度为4,则以4个字节为标准进行对齐,结果会变为20.

    • 针对联合体
    #include <stdio.h>
    union MyStruct
    {
       char da;
       double dda;
       int type[3];
    };
    
    int main(void)
    {
       int leng=sizeof(union MyStruct);
       printf("%d",leng);
       return 0;
    }

    结果为16.

    解析:在union中,变量共享内存,因为double类型长度最长,所以以8字节为标准,而union的大小就是最大的变量的长度。

    int type[3]存放在内存的位置如下

    ........

    ....。。。。

     程序猿必读

  • 相关阅读:
    第2季:从官方例程深度学习海思SDK及API
    H.264帧结构详解
    Linux内核链表
    在Sqlite中通过Replace来实现插入和更新
    mysql 里随机生成时间
    搭建Cordova + Ionic + WebStorm环境开发Web App应用
    Angular Local Storage 使用方法
    angularJS中controller与directive双向通信
    ui-router传递参数
    Sequelize 和 MySQL 对照
  • 原文地址:https://www.cnblogs.com/longzhongren/p/4345740.html
Copyright © 2011-2022 走看看