C++中的sizeof操作符
来源:互联网 发布:奇亚籽品牌推荐知乎 编辑:程序博客网 时间:2024/05/21 01:53
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["<} 如果您在编译期就可以确定字符串常量的长度,请使用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; } 当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’的空字符串表示整个数组的结束。1.1.2. 代替strlen检测字符串常量的长度
1.1.3. 数组