关键字sizeof及其十大特性-创新互联
Sizeof是c/c++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包括基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。
创新互联长期为上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为乌鲁木齐企业提供专业的成都网站建设、网站建设,乌鲁木齐网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。十大特性:
特性0:sizeof是运算符,不是函数;
特性1:sizeof不能求void类型的长度;
特性2:sizeof能求void类型的指针的长度;
其实指针也是变量,只不过这个变量很特殊,它是存放其它变量地址的变量,目前32位计算机平台下的指针变量的大小为4。
特性3:sizeof能求得静态分配内存的数组的长度;
注意:用sizeof求字符串的长度时要加上末尾的‘/0’。
例:
void fun(int array[10])
{
int n = sizeof(array);
}
编辑程序:
#include
using namespace std;
int fun(int array[10])
{
int n = sizeof(array);
return n;
}
int main()
{
int ret;
int array[10] = { 0 };
ret = fun(array);
cout << ret << endl;
system("pause");
return 0;
}
运行结果:
4
请按任意键继续. . .
在fun类n的值为4,而不是40,这是因为在函数参数传递时,数组被转化成指针了,假如直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时,会导致函数执行效率极低,而只传递数组的地址(即指针),只需要拷贝4byte。
特性4:sizeof不能求动态分配的内存的大小;
特性5:sizeof不能对不完整的数组求长度,否则会编译出错;
特性6:当表达式作为sizeof的操作数时,它返回的是表达式计算结果的类型大小,但是它不对表达式求值;
例:程序:
#include
using namespace std;
int main()
{
char ch = 1;
int num = 1;
int n1 = sizeof(ch + num);
int n2 = sizeof(ch = ch + num);
cout << "n1=" << n1 << endl;
cout << "n2=" << n2 << endl;
system("pause");
return 0;
}
结果:
n1=4
n2=1
请按任意键继续. . .
由于默认类型转换的原因,表达式ch + num的计算结果类型为int,因此n1=4;而ch=ch + num的计算结果为char,虽然在计算ch + num时结果为int,当把结果赋给ch时又进行了类型转换,因此表达式的最终类型还是char,故n2=1。
特性7:sizeof可以对函数调用求大小,并且求得的大小等于返回类型(函数类型)的大小,但是不执行函数体;
特性8:sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和;
规则:
a.结构体的大小等于结构体内大成员大小的整数倍;
b.结构体内的成员的首地址相对于结构体的首地址的偏移量是其类型的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数;
c.为了满足规则1和2,编译器会在结构体成员之后进行字节填充;
例:程序:
#include
using namespace std;
int main()
{
struct A
{
int num1 = 0;
int num2 = 0;
double num3 = 0;
};
struct B
{
int n1 = 0;
double n2 = 0;
int n3 = 0;
};
cout << "A=" << sizeof(A) << endl;
cout << "B=" << sizeof(B) << endl;
system("pause");
return 0;
}
结果:
A=16
B=24
请按任意键继续. . .
sizeof(A):4+4+8=16
sizeof(B):4(n1占用地址空间:0,1,2,3)+4(不够8的倍数填充4个地址空间,4,5,6,7)+8(n2占用地址空间:8-15)+4(n3占用地址空间:16-19)+4(不够8的倍数填充4个,20,21,22,23)=24。
特性9:sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
网页名称:关键字sizeof及其十大特性-创新互联
文章来源:http://hbruida.cn/article/dcoojp.html