首页 > 其他 > 详细

编程范式感想(一)——在C中进行对模板功能的实现

时间:2015-11-29 06:25:16      阅读:216      评论:0      收藏:0      [点我收藏+]

最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下C还有汇编,熟悉下计算机的内存机制什么的。

大家都知道关于模板或者说范式的问题,基本在很多高级语言上都有实现,C++,java,C#等等,一方面确实方便了许多,当仍然不可避免的有一些性能上的缺失,就是速度会有所降低,或者是说如果在高级语言中使用模板,会占用更多的内存,因为对于一个模板而言,要实现就必须生成更多的针对不同类型的实例,以满足用户的需求,而且每次实现都是这样,这不可避免的造成了资源上的浪费,但使用模板确实让程序本身的可读性与可维护性大大的提升了,那么要怎么在C这样的相对较为原式的语言中实现呢?

要想在C中实现类似模板的功能,一种可行的思路就是直接进行内存层面上的操作,通过指针实现,下面放上源代码(其实这些都是斯坦福的教授在课中讲的,这里进行再次的讨论与说明,一方面是加强自己的理解,另一方面让没有看过的人有一种新的思路)

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include<string.h>

实现的函数

1 void swap_self(void *vp1,void *vp2,int length)
2 {
3     void *p = malloc(length);
4     memcpy(p,vp1,length);
5     memcpy(vp1,vp2,length);
6     memcpy(vp2,p,length);
7 }

这里用了void*,这个在C中可以被解释成不同类型的指针,但是编译器并不会自动进行解释,就是说编译器并不知道要为void*指向的内容分配多少内存,无论是显式还是隐式,都应对void*进一步进行解释,或者是用malloc进行动态分配内存。

length用来表示要进行的数据类型占用的数据类型是多少个字节。

memcpy则是在内存层面按位进行复制,所以并不关心这段内存上究竟是什么类型的数据,所以这便是一个简单的“模板”。

但这样的“模板”也有本身的缺陷,他并不能完全核对两者的数据类型是否一致,如果vp1是int*,vp2是char*,就会出现问题。

这里需要注意memcpy是将后者按位从前往后从高位到低位进行复制,所以如果后者位数较多,就只有高位的数据得到复制,而忽略低位内存中的数据。

其实关于这一部分的内容还有很多,感觉C和C++中,指针虽然一直被很多人所诟病,但又确实是一种很精髓的东西,用好了真的非常方便。

这是我的第一篇随笔,还不知道该怎么写,今天就写到这里,希望以后能多写写自己的感悟,不断进步。

PS:真的十分推荐斯坦福教授的编程范式的公开课,网易公开课上有,链接如下:

http://open.163.com/special/opencourse/paradigms.html

visual studio中编写C文件只需要建立C++文件,然后将文件名后缀.cpp改为.c就行,但好像不是纯C

visual studio2012在升级win8.1后好像要下载更新包才能正常运行,但先升级win8.1再安装则不存在问题。

编程范式感想(一)——在C中进行对模板功能的实现

原文:http://www.cnblogs.com/nishilv2/p/5003948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!