c++中sizeof()的详细用法

2023-05-16

sizeof()定义

sizeof是一个操作符(operator)。
其作用是返回一个对象或类型所占的内存字节数。

sizeof()语法

sizeof有三种语法形式:

1. sizeof (object); //sizeof (对象)
2. sizeof object; //sizeof 对象
3. sizeof (type_name); //sizeof (类型)

对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。
sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值,
sizeof (表达式); //值为表达式的最终结果的数据类型的大小

举例:

int i;  
sizeof(int); //值为4  
sizeof(i);  //值为4,等价于sizeof(int)  
sizeof i;   //值为4  
sizeof(2);  //值为4,等价于sizeof(int),因为2的类型为int  
sizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double 
 
char ary[sizeof(int) * 10];  //OK,编译无误
1.基本数据类型的sizeof

这里的基本数据类型是指short、int、long、float、double这样的简单内置数据类型。
由于它们的内存大小是和系统相关的,所以在不同的系统下取值可能不同。

2.结构体的sizeof

结构体的sizeof涉及到字节对齐问题。

为什么需要字节对齐?计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,依次类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

字节对齐的细节和编译器的实现相关,但一般而言,满足三个准则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
  2. 结构体的每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节( internal adding )。
  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员后加上填充字节(trailing padding)。

注意:空结构体(不含数据成员)的sizeof值为1。试想一个“不占空间“的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢,于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。

举例:

struct S1  {  
    char a;  
    int b;  
};  
sizeof(S1); //值为8,字节对齐,在char之后会填充3个字节。  
  
struct S2  {  
    int b;  
    char a;  
};  
sizeof(S2); //值为8,字节对齐,在char之后会填充3个字节。  
  
struct S3  {  
};  
sizeof(S3); //值为1,空结构体也占内存
3.联合体(union)的sizeof

结构体在内存组织上市顺序式的,联合体则是重叠式,各成员共享一段内存;
所以整个联合体的sizeof也就是每个成员sizeof的最大值。

举例:

union u  {  
    int a;  
    float b;  
    double c;  
    char d;  
};  
 
sizeof(u); //值为8  
4.数组的sizeof

数组的sizeof值等于数组所占用的内存字节数。

1)当字符数组表示字符串时,其sizeof值将’/0’计算进去。
2)当数组为形参时,其sizeof值相当于指针的sizeof值。

举例:

char a[10];  
char n[] = "abc";   

cout<<"char a[10]<<sizeof(a)<<endl;          //数组,值为10  
cout<<"char n[] = /"abc/" "<<sizeof(n)<<endl;//字符串数组,将'/0'计算进去,值为4


void func(char a[3])  {  
    int c = sizeof(a); //c = 4,因为这里a不在是数组类型,而是指针,相当于char *a。  
}  
void funcN(char b[])  {  
    int cN = sizeof(b); //cN = 4,理由同上。  
} 
5. 指针的sizeof

指针是用来记录另一个对象的地址,所以指针的内存大小当然就等于计算机内部地址总线的宽度。
在32位计算机中,一个指针变量的返回值必定是4。指针变量的sizeof值与指针所指的对象没有任何关系。

举例:

char *b = "helloworld";  
char *c[10];  
double *d;  
int **e;  
void (*pf)();    
  
cout<<"char *b = /"helloworld/" "<<sizeof(b)<<endl;//指针指向字符串,值为4  
cout<<"char *b "<<sizeof(*b)<<endl;               //指针指向字符,值为1  
cout<<"double *d "<<sizeof(d)<<endl;              //指针,值为4  
cout<<"double *d "<<sizeof(*d)<<endl;             //指针指向浮点数,值为8  
cout<<"int **e "<<sizeof(e)<<endl;                //指针指向指针,值为4  
cout<<"char *c[10] "<<sizeof(c)<<endl;            //指针数组,值为40  
cout<<"void (*pf)(); "<<sizeof(pf)<<endl;         //函数指针,值为4  
6. 函数的sizeof

sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。
对函数求值的形式:sizeof(函数名(实参表))

1)不可以对返回值类型为空的函数 void fun ( ) 求值。
2)不可以对函数名求值。
3)对有参数的函数,在用sizeof时,须写上实参表。

举例:

#include <iostream>  
using namespace std;  
float FuncP(int a, float b)  {  
    return a + b;  
}  
  
int FuncNP()  {  
    return 3;  
}  
  
void Func()  {  
}  
  
int main()  {  
cout<<sizeof(FuncP(3, 0.4))<<endl; //OK,值为4,sizeof(FuncP(3,0.4))相当于sizeof(float)  
cout<<sizeof(FuncNP())<<endl;     //OK,值为4,sizeof(FuncNP())相当于sizeof(int)  
//cout<<sizeof(Func())<<endl;     //error,sizeof不能对返回值为空类型的函数求值  
//cout<<sizeof(FuncNP)<<endl;     //error,sizeof不能对函数名求值
return 0;  
}  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中sizeof()的详细用法 的相关文章

随机推荐

  • 如何使用ssh连接windows?

    windows安装并openssh server A 对于新版的Windows10 或 Windows 2019 xff0c 自带SSH Server 可以开启它即可 开启方法 xff1a 安装openssh 设置 应用 应用和功能 可选功
  • 查询mysql数据库里的某字段值所对应的表名与字段名

    应用场景 xff1a 比如在系统的web页面上输入某些值 xff0c 然后想知道是否正确保存了 xff0c 但不知道数据是存到哪个表里 xff0c 除了直接问相关开发人员外 xff0c 还可以通过运行该查询 xff0c 来找到数据对应的表以
  • Linux设置时间格式为yyyy-MM-dd HH:mm:ss

    临时更改显示样式 export TIME STYLE 61 39 43 Y m d H M S 39 永久改变显示样式 vim etc profile export TIME STYLE 61 39 43 Y m d H M S 39 so
  • 树莓派(ubuntu系统)连接后使用HDMI-VGA,VGA无信号

    与系统无关 xff0c 主要修改config txt文件 详细配置参数见 xff1a http blog lxx1 com 1706
  • Ubuntu 20 按ESC进入单用户模式 single user mode

    步骤 xff1a 1 开机重启 2 常按ESC xff0c 此时会进入BIOS选项 xff0c 直接回车就行 3 回车后按一下ESC即可进入Grub启动菜单 xff0c 如果按多了进入Grub命令行 xff0c 那么重新来一遍 4 选择Ub
  • ubuntu设置swap step by step

    在服务器中通过free h可以看到有一个叫做swap的东西 xff0c 这是服务器用硬盘制作的交换空间 在服务器内存不够时 xff0c 将会使用这部分空间 xff0c 但是如果swap空间不足很容易导致被使用的swap占swap总量变大 x
  • python便携包安装pip,pip --version报错“ModuleNotFoundError: No module named ‘pip‘“

    安装python安装包 windows python便携包 python版本界面 xff1a Python Release Python 3 11 3 Python org 下载嵌入式版本 xff1a https www python or
  • Spark-MLlib之分类和回归算法

    分类 逻辑回归 逻辑回归是预测分类响应的常用方法 广义线性模型的一个特例是预测结果的概率 在spark ml逻辑回归中 xff0c 可以使用二项Logistic回归来预测二元结果 xff0c 或者可以使用多项Logistic回归来预测多类结
  • Java中的Collections类

    Java中的Collections类 Collections概述Collections类的常用方法1 将指定列表按升序排列2 反转指定列表中元素的顺序3 使用默认的随机源随机排列指定的列表常用方法的具体使用 xff1a 案例 xff1a A
  • StartlsBack 导致屏幕闪烁的解决方法

    情况 xff1a 两个显示器中的旧显示器出现闪烁情况 xff0c 即重新加载桌面 刷新桌面图标 加载任务栏 xff0c 且每隔几秒就会刷新 xff0c 多次重启无果 如果单连新显示器不会有问题 xff0c 单连旧显示器或者两个同时使用都会出
  • Zabbix-----(六)proxy的搭建

    这里写目录标题 1 Zabbix proxy概述1 1 Zabbix proxy的作用1 2 Zabbix proxy工作过程 3 zabbix proxy的部署3 1 实验环境3 2 zabbix server端 server1 3 3
  • ubuntu查看当前目录大小

    du sh查看当前所在目录的内存大小 du sh 查看当前所在目录中各个文件的大小
  • 达梦数据库字符集

    初次接触达梦 xff0c 记录一些小知识 达梦数据库采用的字符集是在初始化数据库时指定的 xff0c 属于全局性的参数 xff0c 后续不能更改 其支持的字符集选项有 0表示GB18030 xff0c 1表示UTF 8 xff0c 2代表韩
  • efi variables are not supported on this system-(已解决)

    1 如果用的是VMware 则在虚拟机里设置这个选项 2 如果是实体机执行 ls sys firmware efi efivars 查看电脑是否支持efi 并看能不能在bios里修改一下
  • IDEA拉取远程分支(获取最新分支)

    第一步 xff1a 第二步 xff1a
  • 【ChatGPT】帮你写周报,这是实在太干货了,老板都看不下去了

    说到写周报不少小伙伴会觉得是一件头疼的事情 xff0c 一周摸鱼了不到7天 xff0c 周报咋写 xff0c 掰指头都能数清的事在邮件中更是寥寥数字 xff0c 自己看着不舒服 xff0c 老板看着更是头大 xff0c 要不要搞掉他的想法油
  • Archlinux中普通用户无法使用root设置的zsh主题样式

    Archlinux中普通用户无法使用root设置的zsh主题样式 问题分析解决方法1 使用git到github上下载 注意要在普通用户下 2 查看当前主题3 查看可用主题 xff0c 选取下想用的主题4 编辑配置文件 xff0c 更换你想用
  • ArchLinux安装完成登陆时出现login incorrect错误

    汇总下来出现该错误有以下几种原因 1 输入密码时 xff0c 检查numlock是否开启 xff1b 使用字母上方的数字键进行输入 由于安装的linux键盘布局为us键盘布局 xff0c 小键盘在开机时 xff0c 默认为关闭状态 2 有人
  • VirtualBox中如何释放鼠标

    相信在使用VritualBox的小伙伴中 xff0c 有发现他释放鼠标的方式和VMware不一样 xff0c 其实也很简单 xff0c 并且VritualBox也有说明释放的方式 按键盘右边的Ctrl键就可以
  • c++中sizeof()的详细用法

    sizeof 定义 sizeof是一个操作符 xff08 operator xff09 其作用是返回一个对象或类型所占的内存字节数 sizeof 语法 sizeof有三种语法形式 xff1a 1 sizeof object sizeof 对