struct结构的内存对齐

来源:互联网 发布:视唱练耳软件 编辑:程序博客网 时间:2024/05/17 23:33

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) = 12t2的空间占用分析    在规则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
原创粉丝点击