最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下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中进行对模板功能的实现的更多相关文章

  1. jQuery中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

  2. jQuery 中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

  3. jquery中的编程范式,即jquery的牛逼之处

    转自:http://www.iteye.com/topic/1119283 对jquery理解比较深,积累一下,整理了一下格式,就当练习一下 markdown 语法. 本文将结合jQuery源码的实现 ...

  4. 【编程范式】C语言1

    最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * ...

  5. 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

    主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...

  6. Linux Kernel C语言编程范式

    介绍 不同的编程语言具有不同的抽象原语(如下),有的原语抽象层次低,有的原语抽象层次高.其中函数式.DSL是这几年十分热门的编程语言概念. 过程式抽象原语:变量 对象式抽象原语:对象 函数式抽象原语: ...

  7. 冒号课堂 编程范式与OOP思想

    上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...

  8. Python3学习之路~6.1 编程范式:面向过程 VS 面向对象

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...

  9. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

随机推荐

  1. Android 颜色渲染(七) RadialGradient 环形渲染实现水波纹效果

    利用环形渲染我们可以做到什么? 其实很多都是非常常见的,比如上一篇实现的帮帮糖效果, 彩色的热气球,比如这里要讲到的水波纹效果,或者也可以理解为扩散色渲染效果 首先看一下效果图: 轻触屏幕,即可看到对 ...

  2. UDID

    大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途: 1)用于一些统计与分析目的:[第三方统计工具如友盟,广告商如ADMOB等] 2)将UDID作为用户ID来唯一识别用户,省去用户名, ...

  3. 【转】GitHub平台最火Android开源项目整理——2013-08-25 17

    http://game.dapps.net/news/developer/9199.html GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮 ...

  4. JQuery事件的绑定

    关于jQuery事件绑定html: <a href="#" onclick="addBtn()">addBtn</a> <div ...

  5. Magento强大的配置系统

    Magento的配置系统就像是Magento的心脏,支撑着Magento的运行.这套配置系统掌管着几乎所有"module/model/class/template/etc".它把整 ...

  6. Fetch的使用

    import React,{ Component } from 'react'; import { AppRegistry, ListView, Image, Text, StyleSheet, Vi ...

  7. Flie类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  8. 遇到autoreconf: not found

    sudo apt-get install autoconf automake libtool

  9. jsp文件怎么打开呢

    jsp是一种嵌入式网页脚本,正常情况下可以用记事本等文本工具直接打开,也可用DREAMWEAVER等网页设计工具友好编辑.不过这样只能看到程序的源代码.当然,我们也可以用IE等浏览器直接打开浏览,前提 ...

  10. 经历:sybase的sql查询,当传递的参数中包含全角空格(\u00a0),查询慢

    今天,我遇到了一个sybase数据库查询的问题.一句简单的sql,但是不知道为什么查询不出来,导致生产生产服务器频频挂掉.吓得我的小心脏砰砰啊. select DISTINCT A.FCIL_CDE ...