因为对sizeof不是很了解,所以去查了博客啥的,发现还是有大学问的,以下对其用法进行总结。

参考:https://www.cnblogs.com/zhangyz/articles/4736758.html

首先sizeof是个运算符而非函数,因此括号并不是必须的。之所以经常看到括号是为了强调优先级。

1.当sizeof对象是表达式的时候,返回值为类型大小而不是表达式的值,比如:

 char c = ;
int i = ;
cout << sizeof(c + i) << endl;
cout << sizeof(c = c + i) << endl;

前者输出的是4,即int的类型所占字节大小(32位系统),而后者则输出1,因为虽然表达式转型成int,但是表达式最终赋值给char的c,即输出char所占字节。

2.对数组使用sizeof,得到的是数组所占字节,如下:

 int a[];
cout<<sizeof(a)<<endl;
cout<<sizeof(a[])<<endl;

前者输出52,而后者输出4。

3.sizeof无法获取动态分配的内存大小

4.注意字符串类型的末尾存在\0结束符,占一个char空间。因此sizeof("1")返回2。而stelen返回字符个数,不包括\0结束符,两者区分。

5.对结构体使用sizeof,理论上是所有成员数据的大小总和,但考虑到对齐问题,会自动填充字节,以8字节为一个单位。如:

 struct node
{
int a;
char c;
};

对其sizeof,返回值为8,填充3字节。

 struct node
{
int a;
char c;
int d[];
};

对其sizeof,返回值仍为8。

6.对类使用sizeof。

首先要明确c++的struct本质是类,与c中的不同。

当类为空类时,理论大小应该为0。但是实例化类的时候,它必须在内存中占据一定空间,其所占空间由编译器决定。以g++为例,空类的对象占1字节空间。

类中的构造函数、析构函数、成员函数调用时只需知道函数地址,而函数地址与函数类型相关,与实例化的类无关,因此不会在实例中额外添加信息。

静态数据成员放在全局数据成员中,不占实例大小,可以看作特殊全局变量。

 class A
{
public:
static int a;
static char c;
A(){};
~A(){};
void foo(){};
};

综上,对此空类sizeof,返回值为1。因为静态数据成员a,c和成员函数不占类的大小。

对于非静态数据成员,和c的struct类似,需要对齐,即字节填充。

 class A
{
public:
int a;
char c;
A(){};
~A(){};
void foo(){};
};

对其sizeof,返回值为8.a占4B,c占1B,填充3B。

如果有类中有虚函数,则该类的实例中会产生一个指向虚函数表的指针,指针会占据空间。如果普通类继承,子类和基类共享指针。

 class A
{
public:
int a;
char c;
A(){};
~A(){};
void foo(){};
void virtual bar(){};
};

对其sizeof,返回值为12。数据成员8B,加上指针4B(32位系统,64位系统中为8B)。

虚继承时,派生类会生成指向虚基类表指针,占一个指针的空间。增加额外的虚函数时,不增加额外的的指针空间。

 class A
{
int a;
};
class B: public virtual A
{
int b;
virtual void foo(){};
};

对B进行sizeof,返回值为12.数据成员b占4B,从A继承的a占4B,额外增加虚函数的指针4B。

最新文章

  1. SDWebImage的使用
  2. jquery 的队列queue
  3. Caffe学习系列(20):用训练好的caffemodel来进行分类
  4. python 代码片段7
  5. nginx安装 nginx: [emerg] getpwnam(“www”) failed 错误
  6. python代码风格指南:pep8 中文翻译
  7. [整] Android Fragment 生命周期图
  8. 使AIX下ksh可以翻查上一条命令
  9. JavaWeb学习总结(一)——JavaWeb开发入门(转)
  10. ./init的含义
  11. [SDOI 2017]新生舞会
  12. java记事本开发
  13. iOS&amp;nbsp;APP设计规范大全
  14. 【转】配置Exchange 2010 服务器(二)Exchange2010证书配置
  15. Python常用模块--datetime
  16. [UE4]链接多个字符串Make Literal String
  17. windows下解决python输出utf-8中文
  18. [转]KMP算法
  19. linux下更换pip源
  20. 学会快速装系统 图解硬盘分区软件Norton Ghost使用

热门文章

  1. find -exec 批量使用方法
  2. cocoa pods自己的笔记
  3. python基础——列表
  4. TensorFlow Training 优化函数
  5. 基于Verilog的串口接收程序
  6. js使页面重定向
  7. 剑指Offer 14. 链表中倒数第k个结点 (链表)
  8. 如何用Caffe训练自己的网络-探索与试验
  9. python 进程池的使用和坑
  10. vue day3 bootstrap 联动下拉