1.1. sizeof操作符
sizeof操作符用于获得一个表达式的类型的大小,表达式可以是一个运算式、变量或类型,当sizeof后面是单个标识符时,不需要括号。如果sizeof表达式作为整个表达式的一部分时最好使用括号,除非你很清楚各运算符的优选级。sizeof的优先级是一元运算符中最低的,但高于所有二元运算符。使用sizeof获得C++内置类型的值可能为(不同CPU、不同编译器都可能不同):
数据类型 | sizeof | 备注 |
bool | 1 | 一般都是1,尚未发现不为1的编译器 |
char unsigned char signed char | 1 | C++标准定义 |
short [int] unsigned short [int] shigned short [int] | 2 | C++标准规定至少为不比char小,绝大多数编译器都是2,尚未发现有编译器为其它值 |
int unsigned int signed int | 1,2,4,8 | 不同CPU不同,8位单片机可能为1(可能会有编译器选项设为4);16位单片机为2(可能有编译器选项改为4);32位CPU一般为4,64位CPU多数编译器也默认为4,可能有编译选项设为8 |
long [int] unsigned long [int] signed long [int] | 4, 8 | C++标准规定至少为4,但绝大多数编译器也都是4,但有些编译器提供了编译选项,可以设为8 |
long long [int] unsigned long long [int] | 4, 8 | 一般为8,但在一些嵌入式设备的编译器中可能只支持到4个字节的精度 |
float | 4 | 绝大多数编译器都实现为4个字节的精度 |
double | 4,8 | 绝大多数编译器都实现为8个字节的精度,但有些嵌入式编译器可能只支持4个字节 |
long double | 4, 8, 12 | 一般为12,但有些编译器特别是嵌入式编译器可能只支持8字节精度,甚至只支持4字节精度 |
void*, char*, short*, int* , boo*, long*, long long*, float*, double*, long double* | 2,4,8 | 在8、16位单片机上为2,在32位机上为4,在64位机上为64 |
enum | 4,8 | 一般为4,但有的编译器可以支持enum的值定义为long long型扩展到8字节(如VC++ 2010、gcc 4.3.4),有的编译器严格检查定义的值,超过4字节时则给出编译错误(如C++Builder 2010),C++标准并没有规定具体大小。 |
1.1.1. 提高程序的易维护性
合更地使用sizeof可以更好的提高软件的易维护性,例如下面的代码,当我们添加或删除数组中的元素时for循环里的循环条件无需修改。
char* arr[] = {"str1", "str2", "str3", "str4"};
for(int i=0; i
cout<<"arr["<<<"] : "< <
}
1.1.2. 代替strlen检测字符串常量的长度
如果您在编译期就可以确定字符串常量的长度,请使用sizeof,不要使用strlen,如代码1-?所示。但这里只能用于求字符串常量的值,sizeof( )的表达式不能是char*类型,否则就成了指针的大小了,而不是指向的字符串。
// 代码1-7
#include
#define static_strlen(str) (sizeof(str)-1)
int main( void )
{
#define HELLO "Hello"
std::size_t len = static_strlen("Hello") ;
std::cout<<"length of '"< <<"' = "< <
return 0;
}
1.1.3. 数组
当sizeof操作符作用于数组上时,返回的时数组元素的个数乘以元素的大小,例如
char carr[5]; // sizeof(carr) = 5
short* sarr[10]; // sizeof(sarr) = 20
但是,当数组作为函数的参数时,其实是按指针传递的,在函数内使用sizeof作用于参数时,得到的是指针的值,如:
void func( char arr[20], int len)
{
cout<<”sizeof(arr) = “< <
}
所以,在参数为数组时,一般都会有另外一个参数,传递数组中包含元素的个数,否则函数体内不知道传递的实参包含元素的个数。有时也可以通过特殊元素作为结束符,例如对于字符串数组,可以将第一个字符为’/0’的空字符串表示整个数组的结束。