前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文读懂sizeof的用法

一文读懂sizeof的用法

原创
作者头像
fieldli
发布于 2019-09-29 04:32:14
发布于 2019-09-29 04:32:14
6180
举报
文章被收录于专栏:大块小屋-技术大块小屋-技术

sizeof

首先是一个操作符,是内置的,不是函数。主要用来求所占用对象锁占用的字节数。具体使用方式:

sizeof express 或者 sizeof(type) .

以32位为例:

sizeof 基本类型

代码语言:txt
AI代码解释
复制
cout<<  sizeof(int) << endl; // 输出 4
cout<<  sizeof(char) << endl; //输出  1
cout<<  sizeof(short) << endl; //输出  2

sizeof 数组与指针

代码语言:txt
AI代码解释
复制
char chArr[10] = "123";
cout<< sizeof(chArr) << endl; //输出 10 字节 整个数组长度是10个字节
cout<< sizeof(chArr[0]) << endl; // 输出1 ,char型 1
const char* chPoint  = "123";
cout<< sizeof(chPoint) << endl;//输出4 指针的字节数 4
int * p;
cout<< sizeof(p) << endl;//输出4 指针的字节数 4
 

sizeof struct

关键要注意区分字节对齐,

对齐的两个原则:

1.占用空间最大成员变量的字节数作为对齐方式

2.内存按照成员的先后顺序来排列。不够对齐的,补齐字节即进行padding。

代码语言:txt
AI代码解释
复制
//以结构体内最大的字节类型对齐 注意区分下面两种情况:
struct St1
{
    char a;// 1 + padding 3
    int b; // 4 + padding 0
    short c; // 2 + padding 2
}; // total: 4+4+4 = 12

struct St2
{
    int a; // 4 + padding 0
    char b; // 1 + padding 0
    short c; // 2 + padding 1
}; //total:4+1+2 = 8.

sizeof union

代码语言:txt
AI代码解释
复制
union UN{
    int a;
    char b;
};

cout<<"UN:" <<  sizeof(UN) << endl;//输出4 按照最长的对齐

sizeof class

sizeof对class的时候,用来表示class中所有字段类型占用的字节数,对于空类,默认结果是1.

虚继承和虚函数都分别占有一个指针。子类的字节数包含父类。

代码语言:txt
AI代码解释
复制
//空类
class A{} ;//sizeof(A):1
//继承
class A1{public : int a ;} ///sizeof A1: 4
class A2 :public A1 {} //sizof A2:4 继承了A1 的int型字节数

//带有static对象的类型
class A3{static int a;} ;//sizeof(A3):1 static存储在静态存储区,不计算在class对象的字节数内

//虚函数
class B
{
public:
    virtual void f(){};
}; //sizeof  B : 4 .虚函数里保存一个指向虚表的指针,所以是4.

//虚继承
class D : public virtual  B //虚函数 虚继承 两个指针 占有两个int 字节  8
{

};//sizof D : 8字节
class E: public virtual  B  //虚函数 虚继承 两个指针 占有两个int 字节  8
{
    //virtual void f(){};
};//sizof F : 8字节

class F :public  D ,E
{
    //void f(){};
}; //sizof F : 16字节 继承自 D 和E的字节数

pack语句

使用prama pack 可以设定字节的对齐长度。如:

代码语言:txt
AI代码解释
复制
#pragma   pack(4)//设定为4字节对齐  

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++学习笔记---------基础知识sizeof用法
返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stddef.h的C++版本。他是一个和 机器相关的unsigned类型,其大22:14:53小足以保证内存中对象的大小。
ccf19881030
2019/04/29
5890
C++ 虚拟继承
1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继 承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如 下: class A class B1:public virtual A; class B2:public virtual A; class D:public B1,public B2; 虚拟继承在一般的应用中很少用到,所以也往
猿人谷
2018/01/17
2.5K0
C++ 虚拟继承
完全合并C++面试题
大家好,又见面了,我是全栈君 C++面试题 1.是不是父母写了virtual 功能,假设子类重写它的功能不virtual ,也使多态性? virtual修饰符隐形遗传。 private 还集成。问权限
全栈程序员站长
2022/07/18
4020
C++类大小和静态成员/方法
类大小计算 空类的大小为1字节 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的 字节对齐的问题。与C语言一致 没有继承的时候,存在虚函数则需要加上虚指针vptr(+4个字节),如果有多个也只需要加上一个,因为只有一个虚指针。 虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。 示例 #include <iostream> using namespace std; /** * 8=4(x)
用户2929716
2018/08/23
7990
字节大小
首先看一个例子: 1 #include <iostream> 2 using namespace std; 3 4 class A{}; 5 6 class B 7 { 8 int b; 9 char c; 10 }; 11 12 class C 13 { 14 int c1; 15 static int c2; 16 }; 17 int C::c2 = 1; 18 19 class D:public C,public B{ 20 i
猿人谷
2018/01/17
7670
C++重要知识点小结---2
C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能有实例对象的类,这样的类惟一的用途是被继承。这种类成为抽象类。 一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现的虚成员函数。 如: virtual void WithDrawal(float amount) = 0; //纯虚函数 在WithDrawal()的声明之后的“=0”表明程序员将不定义该函数。该声明是为派生类而保留的位
猿人谷
2018/01/17
7590
深度解读《深度探索C++对象模型》之C++对象的内存布局
在C语言中,数据和数据的处理操作(函数)是分开声明的,在语言层面并没有支持数据和函数的内在关联性,我们称之为过程式编程范式或者程序性编程范式。C++兼容了C语言,当然也支持这种编程范式。但C++更主要的特点在支持基于对象(object-based, OB)和面向对象(object-oriented, OO),OB和OO的基础是对象封装,所谓封装就是将数据和数据的操作(函数)组织在一起,在语言层面保证了数据的访问和操作的一致性,这样从代码上更能表现出数据和函数的关系。在这里先不讨论在软件工程上这几种编程范式的优劣,我们先来分析对象加上封装后的内存布局,C++相对于C语言是否需要占用更多的内存空间,如果有,那么到底增加了多少内存成本?本文接下来将对各种情形进行分析。
爱分享
2024/04/15
4311
深度解读《深度探索C++对象模型》之C++对象的内存布局
C/C++ sizeof(下)
sizeof作用于基本数据类型,在特定的平台和特定的编译器中,结果是确定的,如果使用sizeof计算构造类型:结构体、联合体和类的大小时,情况稍微复杂一些。
恋喵大鲤鱼
2018/08/03
1K0
【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹
在 C++ 中,类 是面向对象编程的核心概念之一。它是一种用户定义的数据类型,用于描述一组具有相同特性(属性)和行为(方法)的对象。
换一颗红豆
2024/12/27
8740
【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹
C++从入门到精通——类对象模型
类对象模型是一种编程概念,用于描述和实现面向对象编程(OOP)中的类和对象。在这个模型中,类定义了对象的结构和行为,包括数据成员(属性)和成员函数(方法)。对象是类的实例,具有类的所有属性和方法。类对象模型支持封装、继承和多态等OOP特性,使得代码更加模块化、可重用和易于维护。通过类对象模型,程序员可以创建复杂的软件系统,提高开发效率和代码质量。
鲜于言悠
2024/04/11
2750
C++从入门到精通——类对象模型
什么?C/C++面试过不了?因为你还没看过这个!
(为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。
杨源鑫
2020/06/04
3.8K0
c/c++补完计划(四): 字节对齐和虚继承
前言 猪场最爱考的内容, 亲测. 结构体大小 先来看个基础的: #include <iostream> #pragma pack (8) using namespace std; struct A { char a; int b; double c; }; int main() { // 1: 13 // 2: 14 // 4: 16 // 8: 16 cout << sizeof(A) << endl; } 按理说, ch
sean_yang
2020/07/23
7170
c/c++补完计划(四): 字节对齐和虚继承
c++头脑风暴-多态、虚继承、多重继承内存布局
gdb怎么用这里就不展开了,默认你会使用gdb,使用gdb设置打印格式,然后看对象people的内存布局及大小,如下:
cpp加油站
2021/06/29
7710
sizeof 知多少?
稍熟悉C/C++的朋友,对于sizeof肯定不陌生,通过他我们可以知晓某个类型或者实例的内存大小(以字节计),但是如果深入一下sizeof计算的细节,想来大部分朋友就不会那么熟稔了,不过平心而论,平日的工作中其实也很少需要准确计算类型的内存大小(当然,定性的估算类型内存占用还是需要的),但是了解一下sizeof底层的计算方式并没有什么坏处,甚至于可能对我们的灵魂都有益处(Low-level programming is good for the programmer’s soul),网上关于这个话题的信息其实挺多的,但是大多比较零散,自己尝试写了一篇,算作是一个总结吧~
用户2615200
2018/08/02
5690
sizeof 知多少?
图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。 本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能
Tencent JCoder
2018/07/02
4.7K0
学习笔记-C/C++-结构体与sizeof,内存对齐的题目怎么做
一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.
陈黎栋
2020/02/18
1K0
C++类大小的计算
可以看到,类实例化的对象的大小为1。这是因为即使类是空白类,编译器也会分配一个字节的空间来占位,用来和真正的空白/空变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那么就和没有实例化差不多了)。不过注意的是,如果空白类作为基类被继承了的话,是不会对继承它的类的空间产生影响的,即在继承的一瞬间,基类大小变为0,而继承它的类的大小只与自己的成员变量有关(此处默认为单一继承):
太阳影的社区
2021/10/15
1.2K0
C++ 万字长文第二篇---拿下字节面试
AVL 是严格的平衡树,因此在插入/删除节点时,根据不同的情况,旋转的次数比红黑树多。
syy
2020/08/18
1.4K0
从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n
s1mba
2017/12/28
1.1K0
从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)
C++中类的内存对齐「建议收藏」
1.对于C++中的类的内存占用,存在一个很容易出现错误的点。就是:当一个类中并没有定义任何的成员变量也没有定义虚函数的时候,内存的占用情况,代码如下:
全栈程序员站长
2022/02/08
1.2K0
相关推荐
C++学习笔记---------基础知识sizeof用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档