编程范式感想(一)——在C中进行对模板功能的实现
最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下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再安装则不存在问题。
编程范式感想(一)——在C中进行对模板功能的实现的更多相关文章
- jQuery中的编程范式
浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...
- jQuery 中的编程范式
浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...
- jquery中的编程范式,即jquery的牛逼之处
转自:http://www.iteye.com/topic/1119283 对jquery理解比较深,积累一下,整理了一下格式,就当练习一下 markdown 语法. 本文将结合jQuery源码的实现 ...
- 【编程范式】C语言1
最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * ...
- 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)
主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...
- Linux Kernel C语言编程范式
介绍 不同的编程语言具有不同的抽象原语(如下),有的原语抽象层次低,有的原语抽象层次高.其中函数式.DSL是这几年十分热门的编程语言概念. 过程式抽象原语:变量 对象式抽象原语:对象 函数式抽象原语: ...
- 冒号课堂 编程范式与OOP思想
上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...
- Python3学习之路~6.1 编程范式:面向过程 VS 面向对象
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...
- Edit Distance问题在两种编程范式下的求解
本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...
随机推荐
- 学习笔记:暴力破解WIFI小软件
小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...
- Derby使用2—C/S模式
零.回顾 这部分先来回顾一下上一篇博客中的主要内容.上一篇博客中主要简单介绍了Derby数据的历史,特点,安装以及使用的两种模式.这篇文章主要介绍这两种模式中的一种模式 一.启动服务端程序 第一部分主 ...
- ubuntu14.04 64bit 安装 && 破解quartus13.0 记录
安装文件:Quartus-13.0.0.156-linux.iso Quartus-13.0.0.156-devices-1.iso 1.挂载:sudo mount -o lo ...
- [译]信仰是怎样毁掉程序猿的How religion destroys programmers
作者原文地址 作者John Sonmez 英文水平不够高,翻译不太准确. 翻译地址:译文 尽管文章是13年的,可是这段时间恰好看到.net开源核心之后,各种java和.net掐架. 语言之争有些牵涉到 ...
- cocos2d-x 3.0 Armature jsb 初体验
有段时间没有写游戏代码了,这回来主要任务是要用jsb构建一个aprg动作游戏,看到3.0官方已经绑定好了armature的js函数,先来体验一把 3.0新建项目比2.2方便了很多,在终端运行tools ...
- I'm back
亲爱的博友们, 请忽略这一条, 这只是我个人的一个记录.
- ASP.net导出EXCEL乱码?试试这个
网上的方法有说加meta的,是有用,不过,不够直接, 甭管你asp文件是utf-8还是gb2312,加入下面两句就搞掂: response.Charset="GB2312" ses ...
- CVPR 2013 录用论文【待更新】
完整录用论文官方链接:http://www.pamitc.org/cvpr13/program.php 过段时间CvPaper上面应该会有正文链接 今年有关RGB-D摄像机应用和研究的论文渐多起来了. ...
- web项目设计与开发——DBHelper2
第二次学习的内容是根据DBHelper遍历出数据库中的所有数据. 具体内容为: 一.编写程序 1.创建工程——userMangager 2.在src目录下创建四个包,分别为DAO,DB ...
- 从键盘输入当月利润I,求应发放奖金总数?
企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%:20万到40万之间时 ...