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 应用场合:
以上参考: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