Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2855442
  • 博文数量: 523
  • 博客积分: 11908
  • 博客等级: 上将
  • 技术积分: 5475
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-03 15:50
文章分类

全部博文(523)

文章存档

2019年(3)

2013年(4)

2012年(71)

2011年(78)

2010年(57)

2009年(310)

分类: C/C++

2009-07-28 21:34:17

再谈sizeof

一、            数组

Int a;

char s1[] = "EACF"

a = sizeof(s1);

输出a = 5   char占一个字节

 

以上是在ICC上实验的。

如果在VC6.0下实验结果一样。

 

Int a;

char s1[4] = "EACF"

a = sizeof(s1);

输出a = 4   char占一个字节

 

以上是在ICC上实验的。

如果在VC6.0下,提示错误,array bounds overflow,意思是数组边界溢出了!

如果char s1[x] = "EACF"x>4的话,sizeofs1 = x

二、            指针

32位计算机中,一个指针变量的返回值必定是4(注意结果是以字节为单位),下面的实验是在8位机下的,一个指针变量的返回值是2

unsigned char *p4 = "323456";

unsigned char** ppc = &p4;
unsigned char *p1;
unsigned int *p2;
void (*pf)(void);

 

a = sizeof(p4); 2
a = sizeof(p1); 2
a = sizeof(p2); 2
a = sizeof(pf); 2

a = sizeof(ppc);2

VC6.0下都为4

 

三、结构体

struct S1
{
char c;
int i;
};

VC6.0下实验为8,因为要字节对齐!

 

struct

{

       unsigned char bytes[8];

       int *s;

       void (*p) ();   //函数指针

}OrderTable;

VC6.0下实验为8+4+4=16

 

struct

{

       unsigned char bytes[9];

       void (*p) ();   //函数指针

}OrderTable;

VC6.0下实验为9+4=13,考虑到结果应该能被4整数,所以

SizeofOrderTable=16.

 

struct

{

       unsigned char bytes[9];

       int i;

}OrderTable;

VC6.0下实验为9+4=13,考虑到结果应该能被4整数,所以

SizeofOrderTable=16.

其中i就是最宽基本类型

 

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2)
结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3)
结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

阅读(1523) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~