C++关键字之——sizeof运算符

3 篇文章 0 订阅
订阅专栏

 

目录

1.sizeof 是什么?

2.sizeof怎么用?

  • 基本内置类型
  • 复合类型

3.sizeof与strlen()?

4.sizeof用途?

​​​​​​​1.sizeof 是什么?

sizeof 是一种一元运算符!它返回一个表达式(expr)或一个类型名字所占的字节数。形如sizeof(expr)(括号可以省去),sizeof(type)。sizeof的结果类型是size_t,被定义为unsigned int类型。

2.sizeof怎么用?

其实很简单,上面已经谈到sizeof运算符的两种对象形式,表达式和类型名字。

  • 基本内置类型

对于类型名字而言如C++内置类型名字bool,char,short,int ,long,long long, float,double ,long double,通过Visual Studio如下程序:

#include<iostream>
using namespace std;
int main(void)
{
	cout << "sizeof(bool):"<<sizeof(bool) << endl; //1
	cout << "sizeof(char):"<<sizeof(char) << endl; //1
	//扩展字符集之一:wchar_t宽字符 2
	cout << "sizeof(wchar_t):" << sizeof(wchar_t) << endl;//
	//扩展字符集之二:Unicode字符集char16_t  2
	cout << "sizeof(char16_t):"<<sizeof(char16_t) << endl;
	扩展字符集之三:Unicode字符集char32_t  4
	cout << "sizeof(char32_t):"<<sizeof(char32_t) << endl;
	cout << "sizeof(short):" << sizeof(short) << endl; //2
	cout << "sizeof(int):" << sizeof(int) << endl;  //4
	cout << "sizeof(long):" << sizeof(long) << endl; //4
	cout << "sizeof(long long):" <<sizeof(long long) << endl;//8
	cout << "sizeof(float):" << sizeof(float) << endl; //4
	cout << "sizeof(double):" << sizeof(double) << endl; //8
	cout << "sizeof(long double):" << sizeof(long double) << endl;//8
	return 0;
}

以上截图就是C++所有的内置类型在Visual Studio上运行的结果,其中扩展字符集wchar_t,char16_t,char32_t用的比较少,然而在GCC32 上运行sizeof(long double)=12;而GCC64上sizeof(long double)=16.

  • 复合类型

复合类型主要有指针,引用,以及STL中vector, string等。当定义一个指针(char  *p),尤其要注意sizeof(p),此时是计算指针所占的空间大小,结果为4,所有指针所占用空间大小都为4个字节,不论其指向什么类型的对象,而sizeof(*p),则是指向指针所指向对象空间大小1。原因有二:

  1. ​​​​​​​sizeof运算符满足右结合律,并且与*sizeof运算符的优先级一致;

  2. sizeof不会真正求运算对象的值,即使p是一个无效的指针,在sizeof运算符中,解引用一个无效的指针仍然是一种安全的行为,因为指针并没有被真正使用。​​​​​​​《C++ Primer》

sizeof运算符的结果部分依赖于其作用的类型

  1. 对内置基本类型或其类型的表达式使用sizeof运算符,如int a,b;sizeof(int ) sizeof (a+b),其结果都为其对内置类型取sizeof运算符所得结果;
  2. 对引用类型或解引用指针使用sizeof 运算符,所得结果是引用或指针所指向对象所占空间的大小;
  3. sizeof一个指针,得到的是指针本身所占空间大小,32位系统下4B,而64位系统下8B;
  4. sizeof一个数组,则得到是整个数组所占空间的大小,等价于对数组中每个元素执行一次sizeof求和。Notice:sizeof不会把数组转换为指针处理,除非数组首元素作为函数形参传递,此时数组退化为指针。
  5. 对vector对象或string对象执行sizeof运算只会返回该类型固定部分的大小,不会计算对象中元素占用多少空间。

对于第4,5两条,通过如下代码和结果一目了然!

#include<iostream>
#include<vector>
#include<string>
using namespace std;
void fun(int a[])
{
	//数组作为函数形参,数组退化为指针
	cout << "sizeof(a)="<<sizeof(a) << endl;
}
int main(void)
{
	vector<int>vec;
	string str;
	cout << "sizeof(vec)="<<sizeof(vec) << endl;
	cout << "sizeof(str)="<<sizeof(str) << endl;
	int a[4] = {0,1,2,3};
	fun(a); //
	cout << "sizeof(a)=" << sizeof(a) << endl;
	return 0;
}

对于类,尤其要注意一个空类,一个带有虚函数的类。

#include<iostream>
using namespace std;
class Empty  //空类
{
};
class vEmpty   //有虚函数的类
{
	vEmpty() {}
	virtual int f() {}
	~vEmpty() {}
};
int main(void)
{
	cout << "sizeof(Empty)="<<sizeof(Empty) << endl;
	cout << "sizeof(vEmpty)=" << sizeof(vEmpty) << endl;
	return 0;
}

结果:

sizeof(Empty)=1
sizeof(vEmpty)=4

  • 对于一个空类,无任何成员变量和成员函数,不包含任何信息,按理来说求sizeof应该为0,但是当我们声明该类型的实例,它必须在内存空间占有一定的空间,否则无法使用这些实例。编译器指定,在Visual Studio中,每个空类实例占用一个字节。
  • 若空类中拥有构造函数和析构函数,结果仍为1。调用构造函数和析构函数只需要知道函数的入口地址即可,而这些函数的地址只与类型相关,与类型的实例无关,编译器不会因为函数而在实例内添加任何额外的信息。
  • 而对于拥有虚函数的类,在C++中,编译器一旦发现虚函数,就会为该类型生成一个虚函数表,并在该类型每个实例中添加一个指向虚函数表的指针。

对于类中或结构体,执行sizeof,由于涉及到结构体内存对齐,今后会专门写一篇博客关于结构体内存对齐!

3.sizeof与strlen()

  • sizeof是运算符,而strlen()为C语言库函数;

  • sizeof在编译期间,计算的是类型或表达式对象的所占内存空间的大小,而stren()在运行期,计算的是字符串的长度(遇到‘\0’)结束。

4.sizeof用途

为什么需要sizeof呢?计算类型或者表达式对象在内存空间的大小,如果每次都需要程序员通过程序计算,那将是一个很繁琐的工程,一是为了方便,二是为了安全。(我自己想的,嘻嘻!),。对于sizeof的用途,除了上述介绍的,还有

  1. sizeof一个主要用途是与存储分配和I/O系统那样的例程进行通信;

  2. 便于动态分配一些对象,可以让系统知道要分配多少内存,如:int *p=(int*)malloc(sizeof(int));

  3. 便于一些类型的扩充。在Windows中有很多结构体类型就有一个专用的字段用来存放该类型的字节大小;

  4. 操作对象的字节数在实现时可能变化,涉及操作对象字节大小是用sizeof代替常量计算。

 

 

(c/c++)—— 运算符重载的重点与注意事项
qq_43199575的博客
09-13 93
友元运算符重载与友元函数一样,声明加friend关键字,定义不加。
C++基础————内联函数、auto关键字、范围for循环、指针空值nullptr
Akun_H的博客
01-27 844
1、内联函数 2、auto关键字 3、基于范围的for循环 内联函数 1.内联函数的基本概念 以inline修饰的函数叫内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的消耗,以提升程序运行的效率。 内联函数的特点 1.inline是一种以空间换时间的做法,省去调用函数的的开销,所以代码过长或者有循环和递归的函数不适合使用作为内联函数。 2.inline对于编译器只是一种建议,如果定义为inline的函数体内有循环或递归等等,编译器会自动优化,优化时会忽略掉内联。 3.inlin
c++sizeof()
jing_nnn的博客
07-18 552
1. c++sizeof() sizeof是一个操作符(operator)。 其作用是返回一个对象或类型所占的内存字节数。 2. 语法 sizeof有三种语法形式: 1) sizeof (object); //sizeof (对象) 2) sizeof object; //sizeof 对象 3) sizeof (type_name); //sizeof (类型) 对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。 sizeof对对象求内存大小,最终都是转换为对对
sizeof的使用
ugvihc的专栏
11-10 5072
sizeof- -      sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数                                 关键字sizeof,字节对齐,多继承,虚拟继承,成员函数指针前向声明:本来我对SIZEOF()只有一个小小的问题,通读此文,才发现它的博大精深,在此感谢lostinmymind!我把它贴在这里,和朋友们共享
C++ sizeof的使用总结
MegatronC的专栏
05-13 1456
转自:http://blog.csdn.net/candyliuxj/article/details/6307814 说明:以下代码在VS2008中通过,在32位操作系统下。 1.      定义 sizeof是一个操作符(operator)。 其作用是返回一个对象或类型所占的内存字节数。 其返回值类型为size_t。(size_t在头文件stddef.h中定义,它依赖于编译系统
sizeof C++
小肥羊快快跑
06-30 373
未完待续问题1:sizeof关键字么?sizeof是数据类型的关键字,而非函数。引申:预处理指令是否是C语言中的语言类型?不是。C语言中的语言类型一共有以下5种:(1)表达式语句(2)函数调用语句(3)控制语句(4)复合语句(5)空语句注意:由于预处理指令的结尾不能添加分号,所以预处理指令不是语句问题2:strlen("\0") = ? sizeof("\0") = ?strlen("\0") ...
C/C++ sizeof() 详解(基本数据类型、指针、数组、字符串、函数、结构体、类、联合体)
最新发布
指尖动听知识库
08-17 2031
C/C++ sizeof() 详解主要包括了基本数据类型、指针、数组、字符串、函数、结构体、类、联合体等。
C++11 笔记】关键字剖析 —— this
闻韶
01-22 1145
C++ 关键字:this
C++复习笔记——C++ 关键字
Congying-Wang的博客
11-15 9261
文章目录关键词总览索引关键词详解asmelsenewthisautoenumoperatorthrowboolexplicitprivatetruebreakexportprotectedtrycaseexternpublictypedefcatchfalseregistertypeidcharfloatreinterpret_casttypenameclassforreturnunioncons...
关键字运算符sizeof详解
weixin_39640298的博客
11-26 876
概述 在学习C语言时,老师讲解sizeof时还以为就是一个普通的运算符,只是用来计算所占字节的,现在看来要么我当时在睡觉,要么我灵魂在出窍。在找工作笔试的过程中,总是会碰到关于sizeof用法的各种题目,碰到比较难度比较大的题目时,曾经一度的怀疑人生。现在就把这个运算符的使用归纳一下,以免以后还怀疑人生。 概念及语法 定义:sizeof运算符返回一条表达式或一个类型名字所占的字节数。返回值是一个s...
c++ sizeof
luoganttcc的博客
07-11 253
#include <iostream> using namespace std; int main() { cout << "Size of char : " << sizeof(char) << endl; cout << "Size of int : " << sizeof(int) << end...
C/C++刁钻问题各个击破之细说sizeof
热门推荐
w57w57w57的专栏
07-22 2万+
摘要:Sizeof的作用非常简单:求对象或者类型的大小。然而sizeof又非常复杂,它涉及到很多特殊情况,本篇把这些情况分门别类,总结出了sizeof的10个特性:(0)sizeof运算符,不是函数;(1)sizeof不能求得void类型的长度;(2)sizeof能求得void
C/C++ | sizeof()函数
"You are worthy! You can do it!"
03-14 1万+
C语言中 判断数据类型长度符的关键字 用法 sizeof (类型说明符) sizeof 表达式 定义 sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type(including ag...
C++ sizeof
mokorea的博客
06-10 514
空类型的实例不包含任何信息,但声明为实例时,对该类型求sizeof,得到的结果为1。原因在于,声明该实例时,必须占用一定的内存空间。至于空间占用多少内存,由编译器决定 class MyClass { public: //MyClass(); //~MyClass(); private: }; int main() { MyClass me; cout << sizeo...
c++ sizeof()
华丽的贵族
10-26 218
1、什么是sizeof    首先看一下sizeof在msdn上的定义:     The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value o...
union:一种节省空间的类
tengyft的专栏
05-06 1006
当我们给union的某个成员赋值之后,该union的其他成员就变成未定义的状态了。分配给一个union对象的存储空间至少要能容纳它的最大的数据成员。 union不能含有引用类型的成员,除此之外,它的成员可以是绝大多数类型。在C++11新标准中,含有构造函数或析构函数的类类型也可以作为union的成员类型。为union的一个数据成员赋值会令其他数据成员变成未定义的状态。含有类类型成员的union
C++程序设计:sizeof运算符详解
"C++程序设计中的sizeof运算符用于计算数据类型或变量所占用的内存字节数,是一个非常重要的编程工具。它可以帮助程序员理解和优化代码的内存使用。sizeof运算符通常以`sizeof(<类型>)`或`sizeof(<变量>)`的形式出现...
写文章

分类专栏

  • 程序人生 1篇
  • LeetCode 2篇
  • spring boot
  • Java基础
  • C++ 3篇
  • Linux
  • 计算机网络
  • 操作系统
  • C语言
  • 数据库
  • 数据结构与算法 1篇
  • 设计模式
  • 《剑指offer》 1篇

最新文章

  • Leetcode-007-整数反转
  • LeetCode 344 ---字符串的反转
  • 《剑指offer》之——单链表的翻转
2020年2篇
2019年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王哪能学网站优化网站优化和运营新绛网站优化好不好兴城企业网站优化大同网站优化怎么收费多少成都网站优化推刻 羽云和优化网站凝望云速 捷增城公司网站优化推广方案优化网站排名公司茂名网站优化邯郸家装行业网站优化推广怎么样如何搜索网站内部优化网站优化大揭秘黄浦区官方网站优化公司孝感本地网站优化哪家好手机网站seo优化服务网站优化知识点总结萝岗百度网站优化海伦企业网站优化龙岗网站改版优化SEO优化百度网站技术江干区企业网站优化平台网站建设推广优化郑州找哪家口碑好的企业网站优化服务商许昌网站优化哪家服务好宣城企业网站排名优化哪家有名宝安网站seo优化系统壹起航网站优化活动合肥市网站关键词优化滨州网站seo优化制作香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化