细说关键字sizeof及其十大特性

     Sizeof是c/c++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包括基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。
十大特性:
特性0:sizeof是运算符,不是函数;
特性1:sizeof不能求void类型的长度;
特性2:sizeof能求void类型的指针的长度;
   其实指针也是变量,只不过这个变量很特殊,它是存放其它变量地址的变量,目前32位计算机平台下的指针变量的大小为4
特性3:sizeof能求得静态分配内存的数组的长度;
注意:用sizeof求字符串的长度时要加上末尾的‘/0’
例:
void fun(int array[10])
{
int n = sizeof(array);
}
编辑程序:
#include<iostream>
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<iostream>
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<iostream>
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不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小。
时间: 2024-12-28 17:17:11

细说关键字sizeof及其十大特性的相关文章

前端开发者不得不知的ES6十大特性

前端开发者不得不知的ES6十大特性 转载 作者:AlloyTeam 链接:http://www.alloyteam.com/2016/03/es6-front-end-developers-will-have-to-know-the-top-ten-properties/ ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率. 本文主要针对ES6做一个简要介绍. 主要译自:  http://

《微服务》九大特性重读笔记

http://blog.didispace.com/20160917-microservices-note/ 今天重读了Martin Fowler的<Microservices>,在此记录一下对九大特性的理解. 服务组件化 组件,是一个可以独立更换和升级的单元.就像PC中的CPU.内存.显卡.硬盘一样,独立且可以更换升级而不影响其他单元. 在"微服务"架构中,需要我们对服务进行组件化分解.服务,是一种进程外的组件,它通过http等通信协议进行协作,而不是传统组件以嵌入的方式

网络安全的未来——WAF应当具备的十大特性

概述 据Forrester统计,2013年有超过半数的企业的Web应用被泄露,其中不少因此遭到严重的财务损失.近年来,企业安全事件屡见报端:2011年,多家公司和政府网站被黑客攻击;2012年的DDoS攻击令众多美国银行网站瘫痪;更不用提那些造成数百万用户信用卡信息泄露的网络安全事故了.传统的网络安全防护体系已无法招架如今的黑客们了. 今天,网络罪犯已不仅仅把目光锁定在知名大公司上,每一个存在漏洞的网站都可能成为被攻击的目标.黑客们的攻击方式一般可以分为以下三种:技术性Web攻击.业务逻辑处理攻

AngularJS-chapter1-2-四大特性

4大特性 MVC MVC实例  数据模型,控制器,视图 HelloAngular_MVC.html 图中的 ng-controller="HelloAngular"  定义了HelloAngular这个controller HelloAngular_MVC.js 对应的HelloAngular_MVC.js 中定义了一个function为对应的controller 运行效果 模块化 可以看到上面的 HelloAngular controller是定义了一个全局的function函数,

ISO 9126质量模型:软件质量模型的6大特性和27个子特性

ISO 9126质量模型:软件质量模型的6大特性和27个子特性 ISO9126软件质量模型是评价软件质量的国际标准,由6个特性和27个子特性组成,建议大家深入理解各特性.子特性的含义和区别,在测试工作需要从这6个特性和27个子特性去测试.评价一个软件.这个模型是软件质量标准的核心,对于大部分的软件,都可以考虑从这几个方面 着手进行测评. 一.功能性: 1.适合性:提供了相应的功能 2.准确性:正确(用户需要的) 3.互操作性:产品与产品之间交互数据的能力 4.保密安全性:允许经过授权的用户和系统

面向对象4大特性

面向对象4大特性:抽象,封装,继承,多态. 抽象:在类的设计层次:将某些事务的共同属性提取出来集合到一个类:类与对象之间的关系:类时抽象的,对象是具体的,类是对象的模板,对象的创建时以类未模板的,同一个类创造出来的对象具有共同的属性,但属性值不同. 封装:利用抽象数据类型将数据和基于数据的操作封装在一起(事物的属性和方法),数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系.系统的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流与交互

java中的三(四)大特性

java中的三(四)大特性 :继承 . 封装 .多态.(抽象) 类与类之间的关系: is-a                   继承 .实现 继承的表现:使用extends继承父类 实现的表现:使用importance实现接口 has-a                组合 .聚合.关联 关联的表现:关联关系一般使用成员变量来实现. use-a (need-a)  依赖 依赖的表现,一个类的方法操作另一个类的对象 例如:人(Person) 开 车(Car) 继承 使用extends关键词  子

Django查询集QuerySet及两大特性

1 概念 Django的ORM中存在查询集的概念. 查询集,也称查询结果集.QuerySet,表示从数据库中获取的对象集合. 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据. filter():返回满足条件的数据. exclude():返回满足条件之外的数据. order_by():对结果进行排序. 也就意味着查询集可以含有零个.一个或多个过滤器.过滤器基于所给的参数限制查询的结果. 从SQL的角度讲,查询集与select语句等价,过滤器像whe

最冤枉的关键字----sizeof

<h4>一.常年被人误认为函数.</h4> sizeof 是关键字不是函数,其实就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份.看下面的例子: int i=0:A),sizeof(int): B),sizeof(i): C),sizeof int: D),sizeof i: 毫无疑问,32 位系统下A),B)的值为4.那C)的呢?D)的呢?在32 位系统下,我们发现D)的结果也为4. 咦?sizeof 后面的括号呢?没有括号居然也行,那想想,函数名后面没有