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

C++中sort函数使用方法 一.sort函数 1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑! 2.sort函数的模板有三个参数: void sort (RandomAccessIterator first, RandomAccessIterator last, Compa... 阅读详情

 

目录

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++中的指针是一个变量,其值为另一个变量的地址,即内存位置的地址。指针变量简称指针,它专用于存放变量在内存中的起始地址。指针是C/C++中的精髓所在,其特殊性在于它存放的是内存地址。在C++中,每定义一个变量,系统就会给变量分配一块内存,且内存是有地址的。指针变量通过存储这些地址,使得我们可以间接地访问和操作这些内存中的数据。因此,指针是实现动态内存分配、函数调用、数据结构等高级功能的重要工具。数据类型 *变量名。例如,int *p;就声明了一个指向整数的指针p。官方解释。 阅读详情

相关推荐

C++sizeof运算符全面详解和代码示例

用法说明获取某个类型的大小获取表达式类型的大小获取数组元素个数获取结构体大小(含对齐)与模板、配合编译时类型检查指针大小与指向对象大小无关。

qq_36812406的博客 1010

C/C++ sizeof() 详解(基本数据类型、指针、数组、字符串、函数、结构体、类、联合体)

C/C++ sizeof() 详解(基本数据类型、指针、数组、字符串、函数、结构体、类、联合体)

chenyfan_blog 2万+

[C++ sizeof() 函数详解]——了解C++常用函数sizeof()

C++编程中,sizeof()函数是一个非常重要的函数,它可以帮助程序员获取变量或类型的字节大小。上述代码演示了使用sizeof()函数计算一个数组的大小和数组中单个元素所占的空间大小。在该示例中,一个int类型的元素占据4个字节,而数组中有5个元素,因此整个数组占据20个字节。指针本身占据的空间大小与机器的架构相关,通常为4个字节或8个字节(32位系统通常为4个字节,64位系统通常为8个字节)。对于一个数组,sizeof()函数返回整个数组所占空间的大小(字节数),而不是数组中元素的个数。

PixelProX的博客 468

sizeof既是C++关键字,为什么又是运算符,但不是函数?

C++ 中,运算符是一种特殊的语言元素,用于对操作数进行操作,以产生结果。运算符可以是一元(一个操作数)、二元(两个操作数)或三元(三个操作数)的。它们可以是内置的(语言本身提供)或用户自定义的(通过重载)。sizeof顶着关键字的光环,发挥着(单目)运算符的作用。sizeof属于运算符是因为它具有运算符的特征:有独特的语法,可以应用于类型或表达式作为操作数。在编译时求值,不需要运行时的函数调用。由编译器直接处理,用于确定操作数在内存中的大小,为编译时优化和类型安全提供支持。使用。

行知SLAM 1081

C++基础语法 7】 ——运算符[ 算术运算符 / 赋值运算符 / 关系运算符 / 逻辑运算符 / 位运算符 / sizeof关键字]

C++基础语法

myCSDN3657的博客 343

C++ Primer Plus 1-3章

6,初始化,int a(123), int a={123} , int a{123}, int a{};9,\a振铃,\\ \, \t table,\' ->', \'' -> '';1,C头文件->C++,去掉扩展名.h,加上前缀c(表明来自C)eg.math.h->cmath;4,对类型名用sizeof,加(),eg.sizeof(int),对于变量可无();

2401_86609366的博客 321

C++中将 sizeof( )用于指针的结果

C++中将 sizeof( )用于指针的结果

qq_41317716的博客 790

C语言sizeof关键字—被冤枉的关键字

一、常年被人误认为函数。 sizeof关键字不是函数,其实就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份。看下面的例子: int i=0; A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i; 毫无疑问,32 位系统下A),B)的值为4。那C)的呢?D)的呢?在32 ...

a752392的博客 243

sizeof关键字

如果传入变量 , 会计算变量对应的数据类型对应的内存大小 , 如果传入表达式 , 会计算表达式计算结果的数据类型对应的大小;sizeof是C/C++中的一个编译时运算符

qq_63159859的博客 241

C++

1 C++初识 1.1.3 编写代码 #include<iostream> using namespace std; int main() { cout << "Hello world" << endl; system("pause"); return 0; } 1.1.4 运行程序 1.2 注释 作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码 两种格式 单行注释:// 描述信息 通常放在一行代码的上方,或者一条语句的末尾,对该行代

qq_45951598的博客 498

C++ sizeof 运算符

请尝试下面的实例,理解 C++sizeof 的用法。复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序。其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

学习日常分享 168

c++ 数组长度

是一个关键字,它是一个编译时运算符,用于计算变量或数据类型的字节大小。方式二:begin(),end()方式一:使用sizeof

weixin_44182128的博客 8384

sizeof既是关键字,又是运算符(操作符),但不是函数!

sizeof关键字吗        sizeof关键字,这一点毋庸置疑。你不能将sizeof定义为任何标识符。查看C语言标准文档里的说明: sizeof运算符(操作符)吗        C语言中,sizeof运算符(操作符),而且是唯一一个以单词形式出现的运算符,它用来计算存放某一个量需要占用多少字节,它的结合性是从右到左。查看C语言标准文档里的说明: sizeof是函数吗...

weixin_33694620的博客 219

披着函数外衣的关键字sizeof

通过这篇文章可以让大家更好的理解sizeof而不至于闹出sizeof是函数的笑话。

微风 938

sizeof 的简谈

sizeof 不是函数,而是被当作关键字使用。 举例:int i=0; 1. sizeof (int)    2.sizeof (i)          3.sizeof  i       4                         4                     4 函数后必须要有一个();1. 2. 能编译通过,同时3.也能编译通过且结果为4,那也就证明了它并不是一

qq_40364592的博客 284

C++学习——sizeof、ertern、volatile等其它关键字

关键字完结撒花ヽ( ̄ω ̄( ̄ω ̄〃)ゝ 最后一期包含sizeof运算符、ertern、volatile、mutable、explicit、final、enum、auto。部分关键字为常考笔试题与面试题噢

mingyuexin235的博客 898

C++之《剑指offer》学习记录(2):sizeof

C++之《剑指offer》学习记录(2):sizeof

S13352784013的博客 1043
上一篇: 万丈高楼平地起——写在前面的话
下一篇: C++面向对象编程之——构造函数(一)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值