最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下C还有汇编,熟悉下计算机的内存机制什么的。
大家都知道关于模板或者说范式的问题,基本在很多高级语言上都有实现,C++,java,C#等等,一方面确实方便了许多,当仍然不可避免的有一些性能上的缺失,就是速度会有所降低,或者是说如果在高级语言中使用模板,会占用更多的内存,因为对于一个模板而言,要实现就必须生成更多的针对不同类型的实例,以满足用户的需求,而且每次实现都是这样,这不可避免的造成了资源上的浪费,但使用模板确实让程序本身的可读性与可维护性大大的提升了,那么要怎么在C这样的相对较为原式的语言中实现呢?
要想在C中实现类似模板的功能,一种可行的思路就是直接进行内存层面上的操作,通过指针实现,下面放上源代码(其实这些都是斯坦福的教授在课中讲的,这里进行再次的讨论与说明,一方面是加强自己的理解,另一方面让没有看过的人有一种新的思路)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
实现的函数
void swap_self(void *vp1,void *vp2,int length)
{
void *p = malloc(length);
memcpy(p,vp1,length);
memcpy(vp1,vp2,length);
memcpy(vp2,p,length);
}
这里用了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再安装则不存在问题。