对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#缓存的原理及应用,并以实例加以分析总结,这些对C#初学者来说是很有必要熟练掌握的内容.具体如下: 一.概述: 缓存应用目的:缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 1.缓存的引用空间:System.Web.Caching; 缓存命名空间主要提供三种操作:缓存数据对象.对象的缓存依赖和数据库的缓存依赖.其中缓存任何对象都使用一个类C
-
c#中switch case的用法实例解析
本文实例实现C#以一个收银付费的小程序演示switch case语法如何使用,读入用户选择,把用户的选择赋值给变量n,再根据用户的输入提示付费信息,这种情况使用switch case语法就非常合适了,对于C#的初学者来说,对一些基础技巧的使用是应该非常熟悉的. 具体代码如下: using System; using System.IO; class SwitchApp { public static void Main() { //显示提示 Console.WriteLine("三种选择型号:
-
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/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#泛型Dictionary的用法实例详解
本文以实例形式讲述了C#中的泛型Dictionary的用法.具有很好的实用价值.分享给大家供大家参考.具体如下: 泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱. 很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类: 非泛型集合类 泛型集合类 ArrayList List<T> HashTable D
-
浅析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
-
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#中常见的系统内置委托用法详解
一般来说,C#在公共语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包括Action类的委托.Func类的委托.Predicate<T>委托.Comparison<T>委托等等.以上这些委托的命名空间都是System,所属程序集都是 mscorlib.dll,今天本文就来讲一讲这些委托的使用方法. 就像我们自己已定义好的一样,要实现某些功能,我们可以直接利用系统内置委托,实例化它们,而不必显式定义一个新委托并将命名方法分配给该委托.如: public static voi
-
C#中的IDisposable模式用法详解
本文实例讲述了C#中IDisposable模式的用法,针对垃圾资源的回收进行了较为详细的讲解.分享给大家供大家参考之用.具体方法如下: 首先,对于垃圾回收而言,在C#中,托管资源的垃圾回收是通过CLR的Garbage Collection来实现的,Garbage Collection会调用堆栈上对象的析构函数完成对象的释放工作:而对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Idisposable接口,以及如何使用呢? 先来参考一
-
C#中this指针的用法示例
本文实例展示了C#中this指针的用法,对于初学者进一步牢固掌握C#有很大帮助,具体内容如下: 一.this指针是什么: 这里有一些面向对象编程的概念需要说明:类(Class)的概念和对象(Object)的概念 类是对事物概括,也是C#编码时所有代码归属的基本单位:而对象是对类的实例化,也就是C#里new方法的返回值.写代码是不能直接用操作类,而只能先实例化类,然后我们用这个类被实例化后的对象. 通俗一些的说明是,"类"好比是"人"的概念,而我们把类实例化后,就成为
-
C#基础之委托用法实例教程
本文以实例形式简单介绍了C#中委托的用法,是深入学习C#程序设计所必须掌握的重要技巧.现以教程形式分享给大家供大家参考之用.具体如下: 首先,委托是C#中最为常见的内容.与类.枚举.结构.接口一样,委托也是一种类型.类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数.比如: delegate int GetCalculatedValueDelegate(int x, int y); 在上面的定义中,我们定义了一个委托,这个委托代表着一类函数,这些函数的
-
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#简单多线程同步和优先权用法.分享给大家供大家参考.具体分析如下: 本文实例题目如下: 麦当劳有两个做汉堡的厨师(工号:11,12)和三个销售人员(工号:21,22,23). 厨师生产汉堡,并负责将做好的汉堡放入货架,货架台大小有限,最多放6个汉堡,11和12不能同时往货架台上放汉堡,11具有优先权. 销售人员负责销售食品,三个销售人员取食品时,货架不能为空,三人不能同时取,23优先权最高,21最低.21卖的最快,取得频率最高,22次之. 一天的工作量是销售70个汉堡. 这里先来
随机推荐
- ADSL掉线八宗罪 处理方法招招应对
- IE6、IE7、Firefox javascript 无提示关闭窗口的代码
- Delphi实现碰撞球体完整实例代码
- VC WinExec打开指定程序或者文件的方法
- 使用Python脚本来获取Cisco设备信息的示例
- java 实现文件夹的拷贝实例代码
- Spring Boot 之HelloWorld开发案例
- JS获取元素多层嵌套思路详解
- Jquery获取radio选中的值
- python使用opencv读取图片的实例
- vue与vue-i18n结合实现后台数据的多语言切换方法
- 一道题理解Linux中sort命令的多个参数
- C#中Entity Framework常见报错汇总
- 浅谈VUE防抖与节流的最佳解决方案(函数式组件)
- 浅谈一种让小程序支持JSX语法的新思路
- Vue 实现从文件中获取文本信息的方法详解
- java图片识别文字的方法
- Vue组件之极简的地址选择器的实现
- pygame游戏之旅 添加游戏暂停功能
- Python实现搜索算法的实例代码