C++中的sizeof操作符

来源:互联网 发布:奇亚籽品牌推荐知乎 编辑:程序博客网 时间:2024/05/21 01:53
Technorati 标签: sizeof

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’的空字符串表示整个数组的结束。

原创粉丝点击