struct结构的内存对齐

struct结构的内存对齐

内存对齐的主要作用是:

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:经过内存对齐后,CPU的内存访问速度大大提升。

内存对齐的意义,cpu读取内存数据不是一个个读取,是一片片读取,而且都是2的倍数2,4,,8,16,如果内存不对齐,比如只读了后台的5个字节,
前面的3个字节需要额外的处理,
占用了cpu的处理时间,影响cpu的性能。

先说下 #pragma pack(n) 表示设置为n字节对齐。

对齐分作两部分,一部分是结构里面的数据 二部分是整个结构体本身。

1 结构里面的数据需要偏移,偏移量是#pragma pack(n)和结构本身占用空间中较小的数的倍数
2 结构里面整体的占用空间也必须对齐,占用的空间是#pragma pack(n)和最大数据成员长度中较小的数的倍数


typedef struct {
    char aChar;//1
    float aFloat;//4
    short aShort;//2
}t1;

typedef struct {
    char aChar;//1
    short aShort;//2
    float aFloat;//4
}t2;

t1的空间占用分析:
    在规则1中:放入char,然后偏移4个位置,放入float,在放入short,占用10个位置
    规则2中:总位置4(short)*3   使用了12个位置
    所以sizeof(t1) = 12
t2的空间占用分析
    在规则1中:放入char,然后偏移2个位置,放入short,在放入int,占用8个位置
    规则2中:总位置4(short)*2   使用了8个位置
    所以sizeof(t1) = 8

来个复杂点的
    typedef struct{
        t1 data1;//12
        t2 data2;//8
    }t3;
    针对只含有struct的struct结构大小只是他们的和

更有意思点的
    typedef struct{
        int a;//4
        t1 data1;//12
        t2 data2;//8
        short b;//2
    }t4;
    在规则1中:放入int,不偏移,放入t1,然后放入t2,应该是偏移的,可刚好是short的倍数
    规则2中:总位置4(short)*7   使用了28个位置
    所以sizeof(t4) = 28
//
//  main.c
//  struct_align
//
//  Created by bikang on 16/10/12.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include <stdio.h>
#pragma pack(8)

void talign();

int main(int argc, const char * argv[]) {
    talign();
    return 0;
}

void talign(){
    typedef struct {
        char aChar;//1
        float aFloat;//4
        short aShort;//2
    }t1;

    typedef struct {
        char aChar;//1
        short aShort;//2
        float aFloat;//4
    }t2;

    typedef struct{
        t2 data2;//8
        t1 data1;//12
    }t3;

    typedef struct{
        int a;//4
        t1 data1;//12
        t2 data2;//8
        short b;//2
    }t4;


    printf("sizeof t1=%ld\n",sizeof( t1));
    printf("sizeof t2=%ld\n",sizeof(t2));
    printf("sizeof t3=%ld\n",sizeof(t3));
    printf("sizeof t4=%ld\n",sizeof(t4));

}

内存对齐

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值