对C语言中sizeof细节的三点分析介绍
1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行。
那么如果编程中验证这一点呢?ps:这是前两天朋友淘宝面试的一道题,小编理解:
代码如下:
#include<iostream>
using namespace std;
int main()
{
int i=1;
cout<<i<<endl;
sizeof(++i);
cout<<i<<endl;
return 1;
}
输入结果为 1
1
sizeof中的++i 的副作用并没有显示出来,原因只可能有一个,在编译的时候sizeof执行以后将++i 处理了,++i 的副作用因此被消除了。如果sizeof 是在运行时进行的话,则肯定要注意++i 。实际上sizeof的实现应该是用宏来做的,宏在编译时进行执行。具体实现可以参考下面。
2.sizeof('a')在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
3.文章中讲了两个用宏实现sizeof的经典应用
代码如下:
//适用于非数组
#define _sizeof(T) ((size_t)((T*)0 + 1))
//适用于数组
#define array_sizeof(T) ((size_t)(&T+1)-(size_t)(&T))
先举两个小例子说明两个宏的应用,对于第一个如 _sizeof(int); 的结果就是4;对于第二个先声明一个大小为4的数组int a[4];那么array_sizeof(a)结果为16.
对于非数组的宏定义,先是将0转换为T*类型的指针所指向的地址(此时地址为0)。然后对T类型的地址加1,相当于加上了T类型的大小(即得到了非数组T的大小)。前面的size_t只是将地址转化为int型的整数返回。
一个简单的例子:int* p; p=p+1; --------p是一个int*类型的指针, p+1在地址空间上相当于加上了4个字节。
对于数组的宏定义,类似于非数组的宏定义,为了方便理解,这里可以把数组T看成一个用户自定义的类型,&T表示数组类型的指针,对于数组类型指针加1相当于在地址上加上了该数组大小。由于是用户自定义的类型所以不能强制将0转化为数组类型的地址,只能用加1后的地址减去之前的地址,得到的差值就是数组本身所占的字节大小。
相关推荐
-
浅析C/C++中被人误解的SIZEOF
1:sizeof是一个函数吗?2:sizeof与strlen的区别?3:sizeof(int)(*p)的值是多少? 复制代码 代码如下: int a[10]; sizeof(a);//是多少? sizeof(a[10]);//是多少? void f(int a[10]) { cout<<sizeof(a)<<endl;//值是多少? }View Code 解答:1:对于第一个问题,sizeof 不是一个函数,而是一个语言内置的关键字,不信你试试sizeo
-
C#中的IDisposable模式用法详解
本文实例讲述了C#中IDisposable模式的用法,针对垃圾资源的回收进行了较为详细的讲解.分享给大家供大家参考之用.具体方法如下: 首先,对于垃圾回收而言,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作:而对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Idisposable接口,以及如何使用呢? 先来参考一
-
c#中switch case的用法实例解析
本文实例实现C#以一个收银付费的小程序演示switch case语法如何使用,读入用户选择,把用户的选择赋值给变量n,再根据用户的输入提示付费信息,这种情况使用switch case语法就非常合适了,对于C#的初学者来说,对一些基础技巧的使用是应该非常熟悉的. 具体代码如下: using System; using System.IO; class SwitchApp { public static void Main() { //显示提示 Console.WriteLine("三种选择型号:
-
C#中缓存的基本用法总结
本文初步探讨了C#缓存的原理及应用,并以实例加以分析总结,这些对C#初学者来说是很有必要熟练掌握的内容.具体如下: 一.概述: 缓存应用目的:缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 1.缓存的引用空间:System.Web.Caching; 缓存命名空间主要提供三种操作:缓存数据对象.对象的缓存依赖和数据库的缓存依赖.其中缓存任何对象都使用一个类C
-
C#中sizeof的用法实例分析
sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法.分享给大家供大家参考.具体分析如下: 在C#中,sizeof用来计算类型的大小,单位是字节.有这样的一个类: public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } 在客户端,试图使用sizeof计算该类型的大小. class Program { static void Main(string[
-
C语言安全编码之数值中的sizeof操作符
通常来说获取数组的长度时不要对指针应用sizeof操作符. 现来看看下面这段代码: void clear(int array[]) { for(size_t i = 0; i < sizeof(array) / sizeof(array[0]); i++) { array[i] = 0; } } void dowork(void) { int dis[12]; clear(dis); /*...*/ } clear()使用sizeof(array) / sizeof(array[0])这种用法确
-
C#泛型Dictionary的用法实例详解
本文以实例形式讲述了C#中的泛型Dictionary的用法.具有很好的实用价值.分享给大家供大家参考.具体如下: 泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱. 很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类: 非泛型集合类 泛型集合类 ArrayList List<T> HashTable D
-
C++ sizeof 实例解析
在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承.派生等.sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.sizeof使用形式有三种:sizeof(var_name)或sizeof var_name或sizeof(var_type). [例1]:(列子中忽略构造及析构函数) 复制代码 代码如下: class A { public:
-
C#基础之委托用法实例教程
本文以实例形式简单介绍了C#中委托的用法,是深入学习C#程序设计所必须掌握的重要技巧.现以教程形式分享给大家供大家参考之用.具体如下: 首先,委托是C#中最为常见的内容.与类.枚举.结构.接口一样,委托也是一种类型.类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数.比如: delegate int GetCalculatedValueDelegate(int x, int y); 在上面的定义中,我们定义了一个委托,这个委托代表着一类函数,这些函数的
-
C#简单多线程同步和优先权用法实例
本文实例讲述了C#简单多线程同步和优先权用法.分享给大家供大家参考.具体分析如下: 本文实例题目如下: 麦当劳有两个做汉堡的厨师(工号:11,12)和三个销售人员(工号:21,22,23). 厨师生产汉堡,并负责将做好的汉堡放入货架,货架台大小有限,最多放6个汉堡,11和12不能同时往货架台上放汉堡,11具有优先权. 销售人员负责销售食品,三个销售人员取食品时,货架不能为空,三人不能同时取,23优先权最高,21最低.21卖的最快,取得频率最高,22次之. 一天的工作量是销售70个汉堡. 这里先来
-
C#中this指针的用法示例
本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Class)的概念和对象(Object)的概念 类是对事物概括,也是C#编码时所有代码归属的基本单位:而对象是对类的实例化,也就是C#里new方法的返回值.写代码是不能直接用操作类,而只能先实例化类,然后我们用这个类被实例化后的对象. 通俗一些的说明是,"类"好比是"人"的概念,而我们把类实例化后,就成为
-
C#中常见的系统内置委托用法详解
一般来说,C#在公共语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包括Action类的委托.Func类的委托.Predicate<T>委托.Comparison<T>委托等等.以上这些委托的命名空间都是System,所属程序集都是 mscorlib.dll,今天本文就来讲一讲这些委托的使用方法. 就像我们自己已定义好的一样,要实现某些功能,我们可以直接利用系统内置委托,实例化它们,而不必显式定义一个新委托并将命名方法分配给该委托.如: public static voi
-
浅析C语言中的sizeof
这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char.signedchar和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or atype (including aggregate
随机推荐
- AngularJS学习笔记之ng-options指令
- 用xslt将xml解析成xhtml的代码
- 轻松设置让系统不受恶意代码攻击
- Linux的压缩和解压缩的方法总结
- js实现鼠标左右移动,图片也跟着移动效果
- Javascript设置对象的ReadOnly属性(示例代码)
- asp.net内置对象 Response对象使用介绍
- PHP遍历数组的几种方法
- Android实现TCP断点上传 后台C#服务接收
- Android实现阅读进度记忆功能
- 屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
- 谷歌Chrome浏览器扩展程序开发小记
- linux下的守护进程
- Qt如何设置窗口屏幕居中显示以及设置大小
- jQuery三级下拉列表导航菜单代码分享
- jquery入门—选择器实现隔行变色实例代码
- 浅析jQuery的链式调用之each函数
- 严防死守,保卫IE
- Linux基础知识99问(四)
- PHP递归遍历多维数组实现无限分类的方法