因为对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。

sizeof的用法的更多相关文章

  1. C#中sizeof的用法实例分析

    这篇文章主要介绍了C#中sizeof的用法,包括了常见的用法及注释事项,需要的朋友可以参考下.   sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法.分享给大家供大家参 ...

  2. c++之sizeof的用法

    在此温习一下c语言中sizeof的用法以及c++11.0的标准中,关于初始化的新方式,先上代码: # include "iostream" # include "stri ...

  3. C语言中sizeof()的用法

    语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...

  4. C语言中sizeof的用法

    今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...

  5. sizeof的用法 2007-12-19 11:06

    sizeof的作用是什么?sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义 ...

  6. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  7. sizeof的用法的一些归纳

    1 sizeof 是运算符,不是函数 2 sizeof 不能求得void类型的长度,能求得 void*类型的指针的长度 sizeof(void) 会导致编译错误.因为声明一个变量的最重要的作用就是告诉 ...

  8. c++中sizeof的用法

    /*测试sizeof() 测试环境:windows 7 64位操作系统 VS2012编译器 */ #include <iostream> using namespace std; int ...

  9. sizeof新用法(c++11)

    1.概念 1)sizeof是关键字,也是运算符,用来求对象占用空间的大小,返回字节数 2)c++11允许使用作用域运算符(::)来获取类中成员的大小,以前只允许先创建一个类的对象,通过类对象访问成员得 ...

随机推荐

  1. centos下redis安全相关

    博文背景: 由于发现众多同学,在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!! 因此我们在使用redis时候 ...

  2. 最简单的操作 jetty IDEA 【debug】热加载

    [博客园cnblogs笔者m-yb原创,转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] http ...

  3. eclipse导入git项目出现There are no resources that can be added or removed from the server错误

    上传到git上的项目因为配置了过滤文件,将.settings文件和.project文件都过滤掉了,settings文件中主要存放的是各种插件配置,约束你可以更好的利用IDE进行编码 因为将这两个文件过 ...

  4. offsetWidth与clientWidth 区别

    offsetWidth       //元素宽度.内边距和边框,不包括外边距 offsetHeight      //元素高度.内边距和边框,不包括外边距 clientWidth        //元 ...

  5. 在myeclipse中maven项目关于ssh整合时通过pom.xml导入依赖是pom.xml头部会报错

    错误如下 ArtifactTransferException: Failure to transfer org.springframework:spring-jdbc:jar:3.0.5.RELEAS ...

  6. Ubuntu下math库函数编译时未定义问题的解决

    自己在Ubuntu下练习C程序时,用到了库函数math.h,虽然在源程序中已添加头文件“math.h”,但仍提示所用函数未定义,原本以为是程序出错了,找了好久,这是怎么回事呢? 后来上网查了下,发现是 ...

  7. 通过父元素的hover控制子元素的显示

    .searbar_content_box:hover .searchBar_checked_detail_box{ display:block}

  8. 软件工程第4次作业------石墨文档Android客户端案例分析

    作业要求的博客链接:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 分析产品:石墨文档Android客户端 第一部分 调研和评测 1. ...

  9. c——二分查找

    思路: 1.输入:数组长度n,待查找的有序数组a[],要找的元素key 2.输出:待查找元素在数组中的位置,若不存在返回-1 3.实现:三个指针,left.mid.right #include< ...

  10. 【SpringBoot】整合Redis实战

    ========================9.SpringBoot2.x整合Redis实战 ================================ 1.分布式缓存Redis介绍 简介: ...