C++(十五) — sizeof 运算符
1、基本数据类型
sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。
sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。
使用 sizeof 的语法如下:
sizeof (data type)
其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。
请尝试下面的实例,理解 C++ 中 sizeof 的用法。复制并黏贴下面的 C++ 程序到 test.cpp 文件中,编译并运行程序。
int main()
{
cout << "Size of char : " << sizeof(char) << endl; //
cout << "Size of bool : " << sizeof(bool) << endl; // cout << "Size of int : " << sizeof(int) << endl; //
cout << "Size of short int : " << sizeof(short int) << endl;//
cout << "Size of long int : " << sizeof(long int) << endl; //
cout << "Size of long : " << sizeof(long) << endl; // cout << "Size of float : " << sizeof(float) << endl; // cout << "Size of double : " << sizeof(double) << endl; //
cout << "Size of long double : " << sizeof(long double) << endl;//
cout << "Size of wchar_t : " << sizeof(wchar_t) << endl; //
system("pause");
return ;
}
2、字符串及字符数组
数组作为函数的形参传递时,退化为指针。
size_t getPtrSize(char *ptr)
{
return sizeof(ptr);
} int main()
{
// hello 有 5 个字符,但总字节个数要额外加1个字节(结束符),所以是 6
char szHello[] = "Hello"; //字符串
//字符数组
char a[] = { 'h','e','l','l','o' };
char b[] = { 'h','e','l','l','o' };
char c[][]= { 'h','e','l','l','o' }; cout << "The size of a char is: "<< sizeof(char) //
<< "\nThe length of " << szHello << " is: " << sizeof (szHello) //6,字符串大小 = 本身字符 + '\0'
<< "\nThe size of the pointer is "<< getPtrSize(szHello) << endl;//4 ,当64位机时,指针位8字节 cout << "The size of a a array is: " << sizeof(a) //
<< "\nThe size of a b array is: " << sizeof(b) //
<< "\nThe size of a c array is: " << sizeof(c) //6 = 1*6
<< "\nThe size of a c0 array is: " << sizeof(c[]) //3 = 1*3 相当于一个一维数组 << endl;
system("pause");
}
3、指针
32位机和64位机,指针大小分别为:4 和 8 。
int main()
{
char a[];
cout << "The size of a a array is: " << sizeof(a) //3,表示数组大小
<< "\nThe size of a a array is: " << sizeof(a[]) //1,表示数组的第一个字符占得大小
<< endl; // 数组指针,一个指针,指向有3个元素的一维数组,大小为一个指针的大小,4个字节
// 执行 a1+1 时,要跨过3个 char 型字符长度的大小(相当于跨过这个数组指针的单元大小)
char (*a1)[];
//*a1[0] = 6;
cout << "\nThe size of a a1 array is: " << sizeof(a1) //4,表示指针
<< "\nThe size of a a1 array is: " << sizeof(*a1[]) //1,表示指针指向的字符数组的第0个字符
<< "\nThe size of a a1 array is: " << sizeof(a1[]) //3,表示指针指向的这个字符数组
<< endl; // 指针数组,有3个指针
char *a2[];
cout << "\nThe size of a a2 array is: " << sizeof(a2) //12,表示 3*4=12
<< "\nThe size of a a2 array is: " << sizeof(a2[]) //4,表示第一个指针 << endl; system("pause");
}
4、类
类也是一种数据类型,也就是,固定大小内存块的别名。
定义一个类后,是一个抽象概念,不分配内存,只有当定义了对象后才分配固定大小的内存。
一个类所占的固定内存大小,计算时需要对齐补全。选择4的倍数,结构体内最长数据元素的整数倍。
此外,类中定义的 static 变量是存在全局数据区内,不计算在类的内存中。
类中成员函数,也不计算在内。(因为函数代码和变量,是分开存放的)
比如:
// 总共占用:4+4+4=12
class A
{
bool a; //
int b; //
bool c; //
}; // 总共占用:1+1=2(自动补全为4),,4+4=8
class B
{
bool a; //
bool b; //
int c; //
}; int main()
{
A a1;
B b1;
cout << sizeof(a1) << endl; //
cout << sizeof(b1) << endl; //
system("pause");
return ;
}
另外,需要注意,对于空类:
- 定义空的类,实例化后,占用空间为1个字节;
- 多重继承还是1个字节;
- 虚继承有指针,是4个字节。
之前看过几篇博客,都说是为了让对象能够有唯一的地址以区别不同的对象。这一个字节用来干什么的呢?里面的值是多少无所谓,因为这个字节只是用来占位置而已,正如上面打印的ab的地址一样,它们各自占用一个byte的内存,紧挨着。我们可以通过地址的不同来区别它们。
其实这个问题本身没什么意义,只是探究C++对象内存模型的一个敲门砖。
// 总共占用:1
class A
{ };
// 多重继承还是:1
class B :public A
{ }; // 虚继承是:4,因为虚继承要有个虚表,这是个指针
class C :virtual public A
{ }; int main()
{
A a1;
B b1;
C c1;
cout << sizeof(a1) << endl; //
cout << sizeof(b1) << endl; //
cout << sizeof(c1) << endl; //
system("pause");
return ;
}
参考文献:https://blog.csdn.net/Jacketinsysu/article/details/52207285
C++(十五) — sizeof 运算符的更多相关文章
- C++学习基础十五--sizeof的常见使用
sizeof的常见用法 1. 基本类型所占的内存大小 类型 32位系统(字节) 64位系统(字节) char 1 1 int 4 4 short 2 2 long 4 8 float 4 4 doub ...
- C++(三十五) — 运算符重载
运算符重载的实质:函数重载.除了增加一个关键字 operator 外,与函数重载没有区别,都是通过该类的某个对象来访问重载运算符. (1)重载运算符时,运算符运算顺序和优先级不变,操作数个数不变: ( ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 我的MYSQL学习心得(十五) 日志
我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- Sizeof运算符小结
以下内容援引自<C Primer Plus>中文版第五版Page95 Sizeof运算符以字节为单位返回其操作数的大小.(在C中,1个字节被定义为char类型所占用空间的大小.在过去,1个 ...
- NeHe OpenGL教程 第四十五课:顶点缓存
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- UVA 1252 十五 Twenty Questions
十五 Twenty Questions Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- NeHe OpenGL教程 第三十五课:播放AVI
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十五课:变形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- 关于vtt 与 srt 字幕 的相互转换
我在下载的udacity中教程时,字幕和视频是分离的,对于英文还无法完全听懂的我来说,字幕还是比较重要.不想看解释的可直接跳到最后复制代码运行即可. 查看了vtt和srt的区别,使用记事本打开vtt和 ...
- 模块 - json/pickle/shelve/xml/configparser
序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...
- 解决putty自动断开的问题
解决putty自动断开的问题 putty窗口上右键>change settings.打开后如下,修改seconds of keepalives,让putty每隔若干秒发送心跳包
- js中window.open的参数及注意
IE9下使用window.open时需要注意name参数值不能有"-"出现,否则会出现脚本错误,IE9以及版本测试没有问题 window.open(URL,name,specs ...
- 我的Android进阶之旅------>Android关于HttpsURLConnection一个忽略Https证书是否正确的Https请求工具类
下面是一个Android HttpsURLConnection忽略Https证书是否正确的Https请求工具类,不需要验证服务器端证书是否正确,也不需要验证服务器证书中的域名是否有效. (PS:建议下 ...
- 在PC上调试微信手机页面的三种方法
场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...
- 简明python教程五----数据结构
python中有三种内建的数据结构:列表.元组和字典 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.在python中,每个项目之间用逗号分隔. 列表中的项目应该包括在方 ...
- 转:Oracle中的日期和字符串互相转换
TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 显 ...
- JAVA寄存器
所有进程都使用寄存器,Java虚拟机使用下列寄存器管理系统堆栈: 程序记数寄存器:跟踪程序执行的准确位置 堆栈指针寄存器:指示操作栈项 框架寄存器:指向当前执行的环境 变量寄存 ...
- HBase在数据统计应用中的使用心得
转载自:http://www.cnblogs.com/panfeng412/archive/2011/11/19/2254921.html 1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用 ...