打印

[原创] 关于C语言内存对齐

关于C语言内存对齐

测试条件:
1、在VC的stdio.h中将这句#pragma pack(push,8)改为#pragma pack(push,2);
2、在工程设置里将Struct Number Alignment设置为2;
代码:
#include <stdio.h>
struct example1
{

  char a;
 long b;
};
struct example2
{
   char c;

struct example1 p1[3];
short e;
};
void main()
{

printf("%d\n",sizeof(example2));
}

请问各位:输出结果为什么为22而不是24;
我测试过在内存对齐字节为4,8的条件下我的理解和结果都是一样的,仅仅为2时除外
先谢谢大家了。

TOP

2+3*(2+4)+2=22

[ 本帖最后由 yangguo_cn 于 2007-9-16 23:50 编辑 ]

TOP

引用:
原帖由 yangguo_cn 于 2007-9-16 22:54 发表
2+3*(2+4)+2=22
如果编译器按4字节对齐的话,答案是28还是32呢,
我在VC中得到的结果是32,这就是否说明了32=28+4,这个
结构example2整体也要对齐的啊,

2+3*(2+4)+2=22 是不是也要整体对齐呢,

我认为应该是 1+3*(1+4+1)+1+2+2=24最后的2是整体对齐的要求

结构的长度必须为所用到过的对齐参数的整数倍,
用到对齐参数的有1,2,6,
6为内嵌结构体一个对齐时的总长度,它也要作为一
个对齐参数

[ 本帖最后由 wenksy 于 2007-9-17 20:07 编辑 ]

TOP

按4进行编译的话,是这样的
4+3*(4+4)+4=32

内存对齐有两个方面,例如按4进行编译,第一个结构体是这样的:
第一个结构体内,最长度为long,4字节,所以这个结构体内的变量都按4对齐,当对齐的时候还要与编译器默认的值对齐,所以,a的本身对齐值4和编译器的4进行比较,选择较小的对齐,所以a占4字节,long也是4字节,整个结构体是8字节

第2个结构体,因为包含结构体变量,所以本身的对齐值是这个结构体的长度,为8,所以c对齐的时候,本身的对齐值8和编译器的4进行比较,选择较小的对齐,所以按4对齐,c占4字节
第2个结构体变量占3*8=24字节
第3个e也会按4对齐,所以为4

有时候还要进行 联合对齐的考虑,例如下面的例子:
struct A{
char a;
int b;
double c;
}
假如这个结构体按8对齐,答案是16,因为a+b本身才5,所以一个8字节单元完全可以放下这两个变量,C占8字节,所以是16

总结一下,主要看2个方面吧,呵呵,我的理解是这样
1.结构体内最长的变量和编译器提供的对齐参数进行比较,按较小的对齐
2.联合对齐,标准是最小值是结构体内最长变量的整数倍,这样也是为了节约内存吧

不对还请指出来.

[ 本帖最后由 yangguo_cn 于 2007-9-17 20:20 编辑 ]

TOP

本功能由奇虎搜索实现

相关主题

标题 作者 最后发表
黑客常用命令总结 cisco@2008 2008-06-19
C语言基础知识,你掌握了吗? zz_00 2008-02-01
点击阅读更多关于的相关帖子  更多相关主题