posts - 297,  comments - 15,  trackbacks - 0

主要来自 http://www.cppblog.com/andxie99/archive/2006/10/26/14230.html

定义:

sizeofC/C++中的一个操作符,作用是返回一个对象或者类型所占的内存字节数。

使用:

sizeof有三种语法形式,如下:

1)      sizeof( object ); // sizeof( 对象 );

2)      sizeof( type_name ); // sizeof( 类型 );

3)      sizeof object; // sizeof 对象;

通常不用(3)object可以是表达式,即sizeof可以对一个表达式求值,编译器会根据表达式的最终结果类型来确定大小,通常不会对表达式进行计算。如果对一个函数求值,则返回函数的返回值类型的大小。C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值。

常量性sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用。

sizeof的大小

1.       基本数据类型的sizeof是和系统相关的,所以在不同的系统下取值可能不同。

2.       指针变量的sizeof等于计算机内部地址总线的宽度。

3.       数组的sizeof值等于数组所占用的内存字节数。

4.       结构体的sizeof需要考虑字节对齐。

5.       含位域结构体的sizeofC99中规定intunsigned intbool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是充分利用存储空间,其大致规则为:

1)         如果相邻位域字段的类型相同,且其位宽之和小于该类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

2)         如果相邻位域字段的类型相同,但其位宽之和大于该类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

示例1
struct BF1
{
char f1 : 3;
char f2 : 4;
char f3 : 5;
};
其内存布局为:
|_f1__|__f2__|_|____f3___|____|
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|

位域类型为char,第1个字节仅能容纳下f1f2,所以f2被压缩到第1个字节中,而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2
 

3)         如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式

示例2

struct BF2

{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
由于相邻位域类型不同,在VC6中其sizeof6,在Dev-C++中为2

4)         如果位域字段之间穿插着非位域字段,则不进行压缩;

struct BF3
{
char f1 : 3;
char f2;
char f3 : 5;
};
非位域字段穿插在其中,不会产生压缩,在VC6Dev-C++中得到的大小均为3

5)         整个结构体的总大小为最宽基本类型成员大小的整数倍。

6.       联合体的sizeof,结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。 

posted on 2009-03-27 10:42 chatler 阅读(272) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(10)

随笔分类(307)

随笔档案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感觉这个博客还是不错,虽然做的东西和我不大相关,觉得看看还是有好处的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新评论

阅读排行榜

评论排行榜