13.7.5 sizeof运算符

尽管不应该假设程序中数据类型的大小,但是有的时候需要知道这些信息。使用库例程(如malloc)来实现动态内存分配,或对文件读出或写入数据时,可能需要这些信息。Objective-C语言提供了sizeof运算符,它可以用来确定数据类型或对象的大小。Sizeof运算符返回的是指定项的字节大小。sizeof运算符的参数可以是变量、数组名称、基本数据类型名称、对象、派生数据类型名称或表达式。比如,


sizeof(int)


给出了存储整型数据所需的字节数。在我的MacBook Air计算机上,上述符号会产生结果4(或32位)。如果x声明为包含100个int数据的数组,则表达式


sizeof(x)


将给出存储x中的100个整数所需要的存储空间。

假设myFract是一个Fraction对象,它包含两个int实例变量(分子和分母),那么表达式


sizeof(myFract)


在任何使用4字节表示指针的系统中都会产生值4。事实上,这是sizeof对任何对象产生的值,因为这里询问的是指向对象数据的指针大小。要获得实际存储Fraction对象实例的数据结构大小,可以编写以下语句:


sizeof(*myFract)


在我的MacBook Air计算机上,上述表达式给出了值12。即分子和分母分别用4个字节,加上另外的4个字节存储继承来的isa成员,本章最后的“工作原理”一节中将提到这个成员。

表达式


sizeof(struct data_entry)


的值将是存储data_entry结构所需的空间总数。如果将data定义为包含struct data_entry元素的数组,则表达式


sizeof(data)/sizeof(struct data_entry)


将给出包含在data(data必须是前面定义的,并且不是形参也不是外部引用的数组)中的元素个数。表达式


sizeof(data)/sizeof(data[0])


也产生同样的结果。

尽可能地使用sizeof运算符来避免必须在程序中计算和硬编码数据大小。