内存对齐

转载 2015年10月26日 15:40:01

对内存对齐的理解:

   (struct)内存对齐的规则是:

       1、对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据的偏移量必须是Min(编译器被指定的对齐字节数,该数据成员的自身长度)的倍数。

GCC中,Min(系统默认(4), 数据成员自身长度(char/short/int/double))。

        2、在数据成员完各自对齐之后,结构体(或联合体)本身也要进行对齐,对齐将按照编译器被指定的对齐字节数和结构体(或联合体)最大数据成员长度中,比较小的那个进行。

GCC中,Min(系统默认(4), struct成员中最大的数据类型(char/short/int/double))。

如:

1、

#include <stdio.h>

struct abcd{

    char a;

    char b;

    short c;

    char d;

};

int main()

{

    printf("sizeof(abcd)=%d/n",sizeof(struct abcd));// 运行结果:sizeof(struct abcd)=6

    return 0;

}

      在struct  abcd 中,最大的数据类型是short型。所以在数据成员各自对齐后,整个结构体(或联合体)在进行对齐的时候,按照short型(长度为2)对齐,因为min( 4, short(2) )=2;

 

再看另一个代码:

2、

/*2010-09-03*/

#include <stdio.h>

/*32位机器访问起始地址是4的倍数处的内存比较方便

 min(系统默认(4),数据成员自身长度)*/

struct node1{  //sizeof(struct node1)=8;

    char a1;  //1

    short b1; //2

    int c1;   //4

};

struct node2{  //sizeof(struct node2)=12;

    char a2;  //1

    int c2;   //4

    short b2; //2

};

struct id_all_char{//

    char id3[3]; //3

    char ver;    //1

    char revision;//1

    char flag;    //1

    char size[4]; //4

};

struct idid{

    char id3[3];

    char ver;

    char revision;

    char flag;

    int size;

}__attribute__((packed));//__attribute__((packed))用于告诉编译器不要对其进行内存对齐!

 

struct all_short{//sizeof(struct all_short)=6;而不是8!因为a,b,c三个都是short,所以a,b,c最大的数据类型是short,所以min(4,2)=2(short),所以最后整个struct按照short型(长度为2)对齐

    short a;//2

    short b;//2

    short c;//2

};

 int main(void)

{

    printf("sizeof(struct node1)=%d/nsizeof(struct node2)=%d/n",sizeof(struct node1),sizeof(struct node2));

    printf("sizeof(struct all_short)=%d/n",sizeof(struct all_short));

    printf("sizeof(struct id_all_char)=%d/n",sizeof(struct id_all_char));

    printf("sizeof(struct idid)=%d/n",sizeof(struct idid));

    return 0;

}

以下部分,来自网上,这些内容给了我很大的帮助,所以也粘进来了:

二、C++内存对齐规则

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

对齐规则:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

3、结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

4.各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

5.各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节自动填充。

6.同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

C语言深度解剖读书笔记(3.结构体中内存对齐问题)

很多人都觉得内存对齐这个问题很难,很不好算,总算错,其实我想说只要你画一画就没那么难了。好了,进入正题。 本节知识点: 1.结构体为什么要内存对齐(也叫字节对齐): 其实我们都知道,结构体只是一...
  • qq418674358
  • qq418674358
  • 2013年08月24日 00:28
  • 6353

C/C++ 内存对齐原则及作用

struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成...
  • chy19911123
  • chy19911123
  • 2015年10月04日 09:50
  • 4217

五分钟搞定内存对齐。

写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.   /*******************...
  • me4weizhen
  • me4weizhen
  • 2016年09月19日 23:53
  • 1031

为什么要内存对齐

当我们听到”内存对齐“这个概念时,从字面意思来看,很容易理解。那就是让内存对齐。        当然  就会有人说  你这不是废话 ??         现在我就来说一说为什么要内存对齐以及怎么个对齐...
  • l_tudou
  • l_tudou
  • 2016年07月22日 23:40
  • 748

内存对齐以及如何关闭内存对齐

内存对齐以前接触过,知道有这么回事,昨天面试,面试官问了一个结构体内存分配相关的问题: struct _A{ int a; int b; char c; }A; sizeof(A)=?(32位机器) ...
  • a1205137569
  • a1205137569
  • 2015年10月08日 09:28
  • 404

内存对齐与内存分配原则

首先讲一个概念—-内存对齐一种提高内存访问速度的策略,cpu在访问未对其的内存需要经过两次内存访问,而经过内存对齐一次就可以了。(?)打个比方就是:操作系统在访问内存时,每次读取一定的长度(这个长度是...
  • tingyun_say
  • tingyun_say
  • 2016年05月18日 14:30
  • 2297

对内存对齐的深一步理解

接触内存对齐这个概念,也有三四年了。不过由于我工作后一直做游戏服务器,都是在x86架构的机子上写代码,也没怎么注意内存对齐。使用最多的估计也就是面试时经常问结构体大小。最近在写自己服务器框架的二进流读...
  • weiyuefei
  • weiyuefei
  • 2016年08月05日 14:17
  • 1666

gcc的内存对齐

原文在这里:http://blog.chinaunix.net/uid-7319742-id-2059621.html CPU以字节为单位编址,而C语言指针以指向的数据类型长度作自增和自减。 ...
  • ylluo_hust
  • ylluo_hust
  • 2014年03月16日 18:21
  • 634

C 深度剖析内存对齐

首先说明一下,本文是转载自: http://www.cnblogs.com/clover-toeic/p/3853132.html 引言      考虑下面的结构体定义: typedef ...
  • guoke312
  • guoke312
  • 2016年12月21日 10:38
  • 517

内存对齐例子

具体的理论内容 神马是内存对齐以及为何要内存对齐请看http://blog.csdn.net/kokodudu/article/details/11918219 上面这个连接 将的相当理论 我给...
  • u010566813
  • u010566813
  • 2015年09月17日 01:00
  • 292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存对齐
举报原因:
原因补充:

(最多只允许输入30个字)