您的位置:首页 > 其它

内存对齐方式的总结 如何计算结构体所占内存的大小

2013-09-23 12:24 357 查看
具体的理论内容 神马是内存对齐以及为何要内存对齐请看http://blog.csdn.net/kokodudu/article/details/11918219

上面这个连接 将的相当理论 我给简化了一下 但是还是必须要看的

这里对如何计算结构体所占内存大小做出总结

1、首先要弄清成员变量有效对齐方式的值 N

这里面有四个概念值:

1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。

2)指定对齐值:#pragma pack (value)时的指定对齐值value。

3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。

4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。

2、每个成员的起始地址应满足 “起始地址%N = 0”

3、根据结构体的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍)

看例子:

设结构体如下定义:

struct A {

int a;

char b;

short c;

};

按照我们的步骤来:
1、首先确定每个成员的有效对齐值,由于这里没有指定对齐值 所以 每个成员的有效对齐值就是其自身数据类型的对齐值

a 的对齐值是 4字节(32位机上) b 的对齐值是 1字节 c 的对齐值是2字节

2、起始地址必须满足“起始地址%N = 0”

令起始地址位0x0000 按照变量的顺序存储 则 0x0000%4 = 0;满足条件 占用4个字节 0x0000-0x0003 折四个字节

变量b 的起始地址 是 0x0004%1 = 0满足条件 占用一个字节 就是0x0004

变量c 的起始地址 是 0x0005%2 !=0 所以起始地址要向后移位 知道满足条件位置 0x0006%2 = 0 满足条件 占用2字节
0x0006- 0x0007

总共占用了8字节

3、根据结构体的有效对齐值圆整 结构体的有效对齐值是 其成员中自身对齐值最大的那个值
4 由于8字节正好是4的整数倍 所有就是8字节

例2、

分析例子B;

struct B {

char b;

int a;

short c;

};

依然按照我们的步骤来:

1、找变量的有效对齐位
还是没有指定对齐值 所以就是变量自身的对齐值 b 1字节, a 4字节,c 2字节

2、起始地址满足 对有效对齐值取余=0的条件
令其实地址为0x0000 % 1 = 0满足

变量a 的起始地址为0x0001 %4 !=0
则其实地址要向后移位 知道满足条件为止 0x0004%4 = 0 占用4个字节 0x0004-0x0007

变量c 的起始地址为 0x0008 %2
= 0 满足条件 占用两个字节 0x0008-0x0009

总共占用了10个字节的内存空间

3、圆整 结构体的有效对齐值是4 所以 总共占用的硬为(10+2)%4
= 0个字节 12个字节

例3、看!!!!!!

Intel、微软等公司曾经出过一道类似的面试题:

#include <iostream.h>

#pragma pack(8)

struct example1

{

short a;

long b;

};

struct example2

{

char c;

example1 struct1;

short e;

};

#pragma pack()

int main(int argc, char* argv[])

{

example2 struct2;

cout << sizeof(example1) << endl;

cout << sizeof(example2) << endl;

cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;

return 0;

}

问程序的输入结果是什么?

答案是:

8

16

4

分析 首先程序指定了内存有效对齐值为8

但是结构体和成员的有效对齐值 为自身有效对齐值 和制定有效对齐值的最小的那个值
所以还是变量自身的对齐值

还是按照步骤来:example1
short 2个字节 long4个字节

2、
令起始地址为0x0000 则 short占用两个字节 0x0000 -0x0001 long 的起始地址位0x0004 占用四个字节 0x0004-0x0007

3、
结构体的有效对齐值为long4 总共的字节书必须是4的整数倍 则 正好是8字节

example2
char 1个字节
example1 为结构体需要将=查看结构体内的的有效对齐值 4 字节short 2个字节


2、char起始地址0x0000 占用一个字节 结构体的其实地址为 0x0004 占用8个字节 0x0004-0x000c short两个字节 0

x000e-0x0000f

共16个字节

3、圆整 必须是有效对齐值得整数倍

所以是16个字节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: