陈硕的Blog

吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。

2009年04月19日

原创 Build the Hack CPU with Verilog

最近手痒,买了一本《计算机系统要素:从零开始构建现代计算机》http://www.china-pub.com/33880,把书中讲到的Hack CPU用Verilog实现了一把。这本书除了讲CPU,还讲了数字逻辑、虚拟机、编译器等一些有意思的内容。Hack是一个16-bit Harvard结构的CPU,指令和数据分开存放。数据总线是16-bit,地址总线是15-bit,只有三个寄存器A、D和PC,其中A和D都是16-bit,PC是15-bit。指令长度均为16-bit,每条指令都能在单周期内完成。阅读全文>

发表于 @ 2009年04月19日 13:59:00|评论(loading...)|举报|收藏

2009年01月04日

转载 书摘几则

几段书摘:《Better, Faster, Lighter Java》、《走出软件作坊》、《实现模式》。谈到OO/模式/接口等。阅读全文>

发表于 @ 2009年01月04日 23:44:00|评论(loading...)|举报|收藏

2008年11月22日

原创 借shared_ptr实现copy-on-write

借shared_ptr实现copy-on-write

场景:
一个多线程的C++程序,24h x 5.5d运行。有几个工作线程ThreadW{0,1,2,3},处理客户发过来的交易请求,另外有一个背景线程ThreadB,不定期更新程序内部的参考数据。这些线程都跟一个hash表打交道,工作线程只读,背景线程读写,必然要用到一些同步机制,防止数据损坏。这里的示例代码用std::map代替hash表,意思是一样的:

typedef map > > Map;

map 的 key 是用户名,value 是一个vector,里边存的是不同stock的最小交易间隔,vector已经排好序,可以用二分查找。

我们的系统要求工作线程的延迟尽可能小,可以容忍背景线程的延迟略大。一天之内,背景线程对数据更新的次数屈指可数,最多一小时一次,更新的数据来自于网络,所以对更新的及时性不敏感。Map的数据量也不大,大约一千多条数据。
阅读全文>

发表于 @ 2008年11月22日 20:33:00|评论(loading...)|举报|收藏

2008年10月13日

原创 以boost::function和boost:bind取代虚函数

以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式。boost::function就像C#里的delegate,可以指向任何函数,包括成员函数。当用bind把某个成员函数绑到某个对象上时,我们得到了一个closure(闭包),可以直接调用。阅读全文>

发表于 @ 2008年10月13日 01:31:00|评论(loading...)|举报|收藏

2008年07月05日

原创 Google 开源了自己的 C++ 单元测试框架 : googletest

Google 在美国独立日这一天开源了自己的c++测试框架:googletest  http://code.google.com/p/googletest/

这个工具的主要作者是 Zhanyong Wan,他是 Google 测试技术组的软件工程师。

googletest 与 CppUnit 相比,有两个特点:

1. 使用简单,写 test case 不用分成声明和定义两部分,也不用自己注册 test suite。

CppUnit是从jUnit移植而来,而 C++ 没有 Java 那样的反射机制(和annotation,也没有C#那样的代码元数据 attribute,所以一般需要自己注册各个 test case。虽然 CppUnit 提供了一些宏,但是按照 C++ 成员函数 定义/声明 分离的原则,加一个test case还是得两头改。
而googletest采用了类似CppUnitLite的宏,让写test case就像写一个函数那样简单。

2. ASSE阅读全文>

发表于 @ 2008年07月05日 21:03:00|评论(loading...)|举报|收藏

2008年05月13日

原创 为 bash 添加 auto_cd 功能:如果命令行是一个目录,则进入该目录

为BASH增加auto_cd选项(仿ZSH),打开它之后,如果命令行是一个目录,则进入该目录。例如 .. 进入上层目录,/etc 进入/etc目录。这样省得敲"cd"了。 阅读全文>

发表于 @ 2008年05月13日 06:34:00|评论(loading...)|举报|收藏

2008年02月15日

原创 谈谈数独(Sudoku)

Sudoku 是个很有意思的问题,不难解决,而且有很多好玩的地方。阅读全文>

发表于 @ 2008年02月15日 00:15:00|评论(loading...)|举报|收藏

2007年10月27日

原创 为perforce添加nothave命令,查找尚未添加到depot中的文件(in Ruby)

以前在使用Perforce时犯过这样的错误:编写了新的文件,忘了添加到 Perforce depot 中就匆匆submit,别人sync下来编译不过,影响团队进度。编写了一个Ruby脚本,用于检查当前client中有哪些文件没有添加到depot中,每次submit之前运行一下 p4nothave,就能知道还有哪些文件没有add进去。另外用 p4nothave | p4 -x - add 可以把这些文件都add到depot中。阅读全文>

发表于 @ 2007年10月27日 13:20:00|评论(loading...)|举报|收藏

2007年04月28日

原创 LaTeX 中插入中英双语目录

定义几个新的命令,\echapter \esection \esubsection 等,与原有的 \chapter \section \subsection 等命令配合使用,然后用 \tableofengcontents 生成英文目录。阅读全文>

发表于 @ 2007年04月28日 19:28:00|评论(loading...)|举报|收藏

2007年03月27日

原创 nmake 的 batch mode (批模式) 推理规则可以用一次命令行调用编译多个文件

在一般的推理规则下,把 5 个 .cpp 文件编译为 5 个 .obj 文件需要调用 5 次 cl.exe,而 Microsoft nmake 支持 batch mode (批模式) 推理规则,只需调用一次 cl.exe 就能编译出这 5 个 .obj 文件,加快编译速度。阅读全文>

发表于 @ 2007年03月27日 20:47:00|评论(loading...)|举报|收藏

Csdn Blog version 3.1a
Copyright © 陈硕