size_t类型和sizeof()运算符

1. size_t 类型

size_t是一种无符号的整型数,它在头文件中typedef为unsigned int类型,unsigned int随着编译平台不同,其长度可能不一样,而size_t则希望保持不变。当换了平台之后,只需要重新定义size_t到新的类型,就可以不修改任何库就可以使用。该类型保证能容纳实现所建立的最大对象的字节大小。  

C99中定义格式输出符为%zd,若编译器不支持可以尝试%u或%lu。另外,int类型碰到size_t类型运算时,会自动提升为size_t类型。

 

2. sizeof()运算符

首先,它是个单目运算符,而不是函数。它返回操作数所占存储空间的大小,返回类型为size_t。操作数可以是一个表达式,类型名或对象。sizeof后如果是类型和表达式时必须加圆括号,如果是变量或对象名可以不加圆括号。如果你不确定是否要加括号,就记得都加上括号。

大部分的编译程序在编译的时候就把sizeof计算过了,所以它可以被当作常量表达式使用:

char ary[ sizeof( int ) * 10 ]; // ok

 

C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:

sizeof( foo );// error
void foo2() { }
sizeof( foo2() );// error
struct S
{
        unsigned int f1 : 1;
        unsigned int f2 : 5;
        unsigned int f3 : 12;
};
sizeof( S.f1 );// error

 

至于说,没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。实际会和编译器有关,下面这段代码,在VC 6.0下结果为0,而在Code::Blocks下则是0。

struct test {};

printf("%d\n", sizeof(struct test));

 

总结sizeof 应用场合:

  • 1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。 
  • 2.用它可以看看一类型的对象在内存中所占的单元字节。 void *memset(void *s, int c, sizeof(s))
  • 3.在动态分配一对象时,可以让系统知道要分配多少内存。
  • 4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
  • 5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
  • 6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
  •  

    以上参考:http://dev.firnow.com/course/3_program/c++/cppjs/2008727/134156.html

                   http://blog.csdn.net/starysky/archive/2006/06/04/772691.aspx

                   http://blog.csdn.net/starysky/archive/2006/06/04/772702.aspx

    posted @ 2010-10-09 20:16  jeff_nie  阅读(1553)  评论(0编辑  收藏  举报