定义: sizeof是神圣的sizeof,它是C / C ++中的运算符. 简而言之,其功能是返回对象或类型占用的内存字节数. MSDN上的解释是: sizeofkeyword给出字节,关联的类型(包括聚合类型). 关键字返回typeize_t. 它的返回值类型是size_t,在头文件stddef.h中定义. 该值取决于编译系统. 通常定义为typedef unsigned int size_t;世界上有许多编译器,但是作为一个规范,它们将确保char,有符号字符和无符号字符的大小为1,毕竟,char可用于编程. 最小的数据类型. 语法: sizeof具有三种语法形式,如下所示: sizeof(object sizeof(object sizeof(type_name sizeof(type sizeofobject; sizeof object; so,int oksizeof oksizeof(int oksizeof int; error))因为写3可以用写1代替,因此形式统一并减轻我们大脑的负担,第三种书写方式,算了吧!实际上,sizeof计算对象的大小也被转换为对象类型的计算方式,即sizeof值相同类型的不同对象是相同的.

在这里,对象可以进一步扩展到表达式,即sizeof可以计算表达式. 编译器根据表达式的最终结果类型确定大小,并且通常不计算表达式. 例如: sizeof(是int类型,所以它等效于sizeof(int); sizeof(3.14是double类型,2被提升为double,所以它等效于sizeof(double); sizeof也可以从一个函数调用Value,结果是该函数返回类型的大小,该函数将不会被调用,让我们看一个完整的示例: char foo()printf(“ foo()has been call. \ N”); return intmain()size_tsz sizeof(foo()foo()的返回值类型为char,因此sz sizeof(char),foo()将不称为printf(“ sizeof(foo()C99标准规定函数,表达式无法确定类型并且无法计算位域(bit-field)成员的sizeof值,即以下编写是错误的: sizeof(foo errorvoid foo2()sizeof(foo2()errorstruct unsignedint f1 unsignedint f2 unsignedint f3 sizeof (S.f1 sizeof常量sizeof的计算是在编译时进行的,因此它可以用作常量表达式,例如: char ary [sizeof(int ok最新的C99标准规定,也可以在运行时计算sizeof,因为以下程序在Dev中-可以在C ++中正确执行: int动态赋值函数[n]; C99还支持动态定义数组printf(“%d \ n”,sizeof(ary));好. 输出10,但未完全实现C99标准. 该代码在编译器中不起作用,上述代码在VC6中无法编译.

因此,我们最好认为sizeof是在编译时执行的,这样它就不会带来错误并使程序更具可移植性. sizeof基本数据类型的基本数据类型是指简单的内置数据类型,例如short,int,long,float和double. 由于它们都是与系统有关的,因此在不同的系统下值可能会有所不同. 我们的注意,在这方面尽量不要给您的程序移植带来麻烦. 通常,在32位编译环境中,sizeof(int)的值为4. 指针变量sizeof已经学习了数据结构,应该知道指针是一个非常重要的概念,它记录了另一个对象的地址. 因为它用于存储地址,所以它当然等于计算机内部地址总线的宽度. 因此,在32位计算机上,指针变量的返回值必须为4(请注意,结果以字节为单位). 可以预期,在将来的64位系统中,指针变量的sizeof结果将为8. char * pc“ abc”; int * pi;字符串* ps;字符** ppc和pc;无效(* pf)(); //函数指针sizeof(pc结果为4sizeof(pi结果为4sizeof(ps结果为4sizeof(ppc的结果为4sizeof(pf的结果为4指针变量. )指针变量的sizeof值与指针指向的对象,正是因为所有指针变量都占用相同的内存大小,所以MFC消息处理函数使用两个参数WPARAM,LPARAM可以传输各种复杂的消息结构(使用指向结构的指针).

数组的sizeof数组的sizeof等于数组占用的内存字节数,例如: char a1 []“ abc”; int a2 [3]; sizeof(a1的结果为4,在字符末尾有一个NULL终止符)字符sizeof(a2的结果为3 * 4 = 12(取决于int). 有些朋友使用sizeof作为开头的数组元素数. 现在,您应该知道这是错误的,因此应该如何查找数组元素?数字很容易,通常以以下两种方式编写: int c1 sizeof(a1 sizeof(char总长度/单个元素的长度int c2 sizeof(a1 sizeof(a1 [0]总长度/第一个元素的长度写在这里)让我问,下面的c3和的值是什么?void foo3(char a3 [3])intc3 sizeof(a3 voidfoo4(char a4 [])int sizeof(a4也许您已经知道当您尝试回答的值时c3的答案是错误的,是的,c3!=3. 这里,函数参数a3不再是数组类型,但将其转换为一个指针,等效于char * a3. 为什么不仔细考虑它,我们调用函数foo1,当程序将分配te在堆栈上的大小为3的数组,不是吗!该数组被“传递”,调用者只需传递实际参数的地址,因此a3自然是指针类型(char *),c3的值仅为4.

sizeof结构是初学者最常问的问题之一,因此有必要花更多时间在写作上. 让我们首先来看一个结构: struct S1字节,然后总和应该为5. 您在机器上尝试过吗?也许您是对的,但很可能您是错的! VC6中的默认设置为8. 为什么我总是受伤?请不要沮丧. 让我们考虑一下sizeof的定义-sizeof的结果等于对象或类型占用的内存字节数. 好吧,让我们看一下S1的内存分配. 情况: S1 s1定义上述变量后,添加一个断点,运行程序,观察s1所在的内存,以VC6.0为例,您发现什么,s1的地址为0x0012FF78,其数据内容如下所示: 0012FF78: 61 CC CC CC FF FF FF FF FF FF发现了CC发生了什么,中间有3个字节. 查看MSDN上的说明: 当应用structuretype变量时,sizeof返回实际大小,其中可能包括插入的填充字节对齐. 这就是传说中的字节对齐!一个重要的话题出现了.

为什么需要字节对齐. 计算机组成原理告诉我们,这有助于加快计算机的访问速度,否则将花费更多的指令周期. 因此,编译器将默认处理结构(实际上,其他地方的数据变量也是如此),将基本数据类型的宽度设置为2(短整除地址,依此类推). 两个数字的中间,您可能需要添加填充字节,因此整个结构的sizeof值已经增加. 让我们交换char和int在S1中的位置: 结构S2看看sizeof(S2)的结果是什么,如何仍然看存储器8,原始成员c后面还有3个填充字节,这就是为什么不用担心,下面总结这些规则: 字节对齐的细节与编译器的实现有关,但是通常,要满足三个条件: 每个结构成员相对于该结构的第一个地址的偏移量是成员大小的整数倍;如果有必要,编译器将在成员之间添加内部字节;结构就是结构整数倍最广泛的基本类型成员的大小. 如有必要,编译器将在最后一个成员之后添加尾随填充. 对于上述标准,有几点需要解释: 该点存在,因此我们可以只考虑成员的偏移量,这很容易想到. 想一想为什么. 结构成员相对于结构的第一个地址的偏移量可以通过宏offsetof()获得,该宏也定义在stddef.h中,如下所示: #define offsetof(s,m)(size_t)& (((s偏移量,方法为size_t pos pos等于4. 基本类型是指前面提到的字符,如char,short,int,float,double等. 'S内置数据类型,此处的“数据宽度”是指到它的sizeof大小.

由于结构的成员可以是复合类型,例如另一个结构,因此在查找最宽的基本类型成员时,应包括复合类型成员的子成员,而不是将复合成员视为整个. 但是,在确定复合类型的构件的偏移位置时,将复合类型视为一个整体. 这里的描述有点草率,想起来也有点草草,让我们看一下示例(具体值仍然是VC6作为示例,以后将不再说明): struct S3 charc1; S1 charc2 S1的最宽简单成员的类型为int当S3考虑最宽的简单类型成员时,S1“中断”,因此S3的最宽简单类型为int,因此变量存储空间的第一个地址由S3定义的值需要除以4,整个sizeof(S3)的值也应可整除. c1的偏移量是0,而s的偏移量现在是一个整数. 作为结构变量,它还满足前三个条件,因此其大小为8,偏移量为4,在c1 3个填充字节和c2 12之间是必需的,将c2的大小计为13、13不是填充字节. 最后,sizeof(S3)的值为16. 通过上面的描述,我们可以得出一个公式: 结构的大小等于最后一个成员的偏移量加上它的大小加上末尾的填充字节数,即: sizeof(struct offsetof(最后一项sizeof(最后一项sizeof(尾随填充))在这里,朋友应该对结构的sizeof有新的了解,但不要太高兴,这会对具有没有被提及,那就是编译器的pack指令.

它用于调整结构的对齐方式. 不同编译器的名称和用法略有不同. 在VC6中,它是通过#pragma pack实现的. 您也可以直接修改/ Zp编译开关. #pragma pack的基本用法是: #pragma pack(是字节对齐数,其值为1、2、4、8、16,默认值为8,如果该值小于结构的sizeof值成员的偏移量应基于此值,也就是说,结构成员的偏移量应取两者中的最小值,公式如下: offsetof(item sizeof(item查看示例: #pragma pack(push)将当前包设置保存在堆栈上#pragma pack(2)//必须先使用struct S1 structS3 charc1; S1 charc2 #pragmapack(pop)来还原以前的包设置,然后再计算结构sizeof (S1),min(2,sizeof(i)的值)是2,因此i的偏移量是2,加上sizeof(i)等于6,可以除以2,因此整个S1的大小是6类似地,对于sizeof(S3),s的偏移量是2,c2的偏移量是8,加上sizeof(c2)等于9,无法除以2,并且添加了填充字节,因此sizeof(S3)等于10.

现在,朋友可以轻松呼吸: )还有一点要注意,“空结构”(不包括数据成员)的大小不是0,而是1. 想象一下如何解决“空闲空间”变量并如何区分两个不同的“空结构”变量. 因此,还必须存储“空结构”变量,以便编译器可以为空间占用分配一个字节的空间. 如下: struct S5 sizeof(S5包含位域结构的sizeof前面已经说过,不能单独取位域成员的sizeof值,我们在这里讨论包含位域的sizeof结构,仅考虑其特殊性. 具体列出. C99规定int,unsigned int和bool可以用作位字段类型,但几乎所有编译器都对其进行了扩展,以允许存在其他类型. 使用位字段的主要目的是压缩存储空间. 一般规则是: 相邻位字段的类型相同,并且它们的位宽之和小于该类型的大小,接下来的字段将在前一个字段之前存储,直到无法容纳为止;类型相同,但是其位宽度的总和大于该类型的sizeof的大小,则以下字段将从新的存储单元开始,并且偏移量是其类型大小的整数倍;具体的i每个编译器的实现都不同. VC6采用未压缩模式,而Dev-C ++采用压缩模式. 整个结构的总大小是最宽的基本类型成员的大小的整数倍.

让我们看一个例子. 示例1: 结构BF1 charf1 charf2 charf3的内存布局为: _f1__ | __f2__ | _ | ____ f3 ___ | ____ | 1316位字段类型为char,第一个字节只能容纳f1和f2,因此f2被压缩为第一个字节. 在1个字节中,f3只能从下一个字节开始. 因此,sizeof(BF1)的结果为2. 示例2: 结构BF2 charf1 shortf2 charf3由于相邻位字段的类型不同sizeof计算结构体大小,因此在VC6中其sizeof为6,在Dev-C ++中为2. 示例3: 结构BF3 charf1 charf2; char f3非位字段散布在其中,不会产生压缩,在VC6和Dev-C ++中获得的大小为3. 联合的sizeof结构在内存组织中是顺序的sizeof计算结构体大小,并且联合是重叠的. 每个成员共享一部分内存,因此整个联合的sizeof是每个成员的最大sizeof. 结构的成员也可以是复合类型. 在这里,复合类型成员被视为一个整体. 因此,在以下示例中,U的sizeof值等于sizeof(s). 联合

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-229320-1.html

c语言求占用内存sizeof,C语言中sizeof的用法相关推荐

  1. c语言 fread读指定字节,c语言中fread的用法

    fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出.下面小编就跟你们详细介绍下c语言中fread的用法,希望对你们有用. c语言中fread的用法如下: # ...

  2. c语言eof不起作用,c语言中EOF的用法

    c语言中EOF的用法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中EOF的用法 1.EOF是end of fi ...

  3. c语言define需要分号骂,C语言中define的用法

    C语言中define的用法 2016-01-06 15:00  来源: 博客园 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便. 预处理命令以"#& ...

  4. c语言typedef怎么自定义函数,c语言中typedef的用法

    C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供了许多低级处理的功 ...

  5. 在c语言中通过return语句,c语言中return的用法

    c语言中return的用法 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return语句返回. return 语句的一般形式为:return 表达式; 或者:retu ...

  6. c语言getchar函数的作用,c语言中getchar的用法函数用法

    当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止.下面小编就跟你们详细介绍下c语言中getchar的用法,希望对你们有用. c语言中getchar ...

  7. c语言sizeof啥作用,C语言中sizeof什么意思

    C语言中"SIZEOF(INT)"是什么意思?有什么作用? C语言中,sizeof是一个? sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符:sizeof是计算 ...

  8. sizeof是c语言的一种运算符,kingsize是什么意思? C语言中sizeof是什么意思

    in size是什么意思,不要告诉小编"在尺寸""和大小"什in size是什么意思,不要告诉小编"在尺寸""和大斜什么的,说的通 ...

  9. c语言中size of 用法,C语言中sizeof()的用法

    要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在 ...

最新文章

  1. 7 种 JVM 垃圾收集器,看完我跪了。。
  2. Spark跟Flink的常见问题
  3. 31,32,33_过拟合、欠拟合的概念、L2正则化,Pytorch过拟合欠拟合,交叉验证-Train-Val-Test划分,划分训练集和测试集,K-fold,Regularization
  4. mixamo网站_超全面的素材网站推荐
  5. 博弈——通过博弈思想解决的问题(hdu1847,2147)
  6. 现代企业,最好都是合伙人制度,都是股份制,全员持股最好
  7. rk3399_android7.1的HDMI显示实现固定分辨率
  8. 不能为属性:[commandName]找到setter 方法
  9. 计算机网络拓扑结构详解
  10. 九大百度竞价操作技巧
  11. 和朱晔一起复习Java并发(一):线程池
  12. 计算机开机后无法网络拨号怎样处理,电脑不能拨号上网显示调制解调器已删除怎么办...
  13. 渗透之代理小知识--
  14. 广州十日 --2006/3/18
  15. 多元素过渡理解和一点透
  16. 自定义自己的笔记本做WiFi热点
  17. 掌上军营服务器信息,智慧军营之视频监控系统
  18. 基于 CSS3 的下一代 Web 应用开发,第 1 部分: 发展历史及新特性
  19. 戴尔710服务器网卡型号怎么查,怎么看网卡驱动有问题_怎么看网卡驱动型号
  20. 量化策略:如何利用死猫反弹获利?

热门文章

  1. 2022-2028年中国装配式装修行业市场研究及前瞻分析报告
  2. 项目中使用 Git 高频场景
  3. Go 学习笔记(72)— Go 第三方库之 pkg/errors 带堆栈的错误处理
  4. OpenCV 笔记(07)— Mat 对象输出格式设置(Python 格式、CSV 格式、NumPy 格式、C 语言格式)
  5. BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习...20201107
  6. jieba分词工具的使用方法
  7. LeetCode简单题之最长的美好子字符串
  8. LeetCode简单题之相对名次
  9. 用OpenCV进行摄像机标定
  10. Google Pixel 超分辨率--Super Resolution Zoom