Metaprogramming in .NET 读书笔记 - 1

什么是 Metaprogramming (元编程)

元编程从字面上理解就是“能处理程序的程序”。

这里的“处理”,有两个意思。

一是“编写”、“生成”,最经典例子就是编译器,它将我们的所编写的高级语言翻译成机器代码。编译器就像建筑工人,将“蓝图”(高级语言)转化成“高楼大厦”(机器语言)。还有一个我们经常用到的就是“宏”(Macro)。我们可以在代码中使用预先编写好的宏,在编译期,宏会被自动展开成相应的代码。这样的好处是用机器带替人类劳动。

“处理”的另外一个意思就是“处理自己”,元编程让程序在运行时了解自己的状态,并动态的扩展并执行的相应逻辑。

当然,最高级的“处理”就是能完全代替人脑的人工智能。如果那一天到来,我们就距离生活在Matrix里不远了。

元编程的实现

元编程主要实现在编译期前后以及运行时。

元编程主要依赖于以下技术:

  • 代码生成(code generation)
  • 反射(reflection)
  • 汇编重写(assembly rewriting)
  • 表达式 …
more ...

定时器以及其它 - phxrpc阅读笔记(2)

写在前面

phxrpc使用了协程(ucontext)和IO复用技术(epoll)来实现网络通信。定时器在其中起到了非常重要的作用。下面我们就来分析一下phxrpc的timer.[h|cpp]中的代码。

system_clock vs steady_clock

system_clocksteadly_clock都是来自<chrono>库,都是用来获取当前时间的。

system_clock用来从系统时钟获取时钟时间(wall clock time),而steadly_clock获取的是时钟tick,而且保证随着时间的推移,时钟tick数不会变小。

然而实际上,在某些系统下,这两个时钟的实现是一致的。详细信息可以参考这里

注:在clang++ 4.2.1, g++ 5.4 下实验,这两个时钟是不同的。所以个人认为在这里最好不要做任何无意义的假设。

几毫秒的安睡

void …
more ...

自定义你的stream buffer - phxrpc阅读笔记(1)

写在前面

phxrpc是微信团队开源的一个轻量级RPC框架。

我对RPC这些东西了解不多,看到phxrpc的代码相对简单,而且还在初步开发阶段(在本文写作时,版本号是0.8)。所以想读一读,提高一下姿势水平。

就是这样。

自定义stream buffer

network/socket_stream_base.[h|cpp]中的class BaseTcpStreamBuf继承了std::streambuf,自定义了一个流缓冲区,用于接收/发送TCP数据包。

这个用法比较新颖(或者是我见识少),网上的资料也不多。这里翻译一篇介绍文章,学习一下新姿势。

A beginner's guide to writing a custom stream buffer

流(streams)是STL中提供的一个重要的抽象概念。著名的“Hello world”程序,便是使用了std …

more ...

用C++实现一个通用的sort函数

问题

用C++实现一个尽可能通用的sort函数

分析

一个通用的sort函数应该包含以下要点:

  • 确实可以排序(LOL)
  • 可以应对C-style array和C++-style container的排序需求
  • 可以应用于任意random access container
  • 可以使用用户自定义的排序函数 / 仿函数 / lambda函数

实现

为了与std中的通用函数做区别,这里的命名规则,包括类型与函数,都在前面加了"my"以示区别。可能与标准的命名法有出入,所以仅做示例用。

思路

拷贝代码是愚蠢的行为。

或者说,

对于同一钟实现,尽量使用同一份代码。

感谢C++ Templates,对于不同类型与需求的函数,我们可以将生成多份代码的劳动放心的交给编译器。并且,Templates的代码生成是在编译期完成的,即不会造成额外的代码膨胀(如果你姿势正确的话),也一般不会造成额外的运行时开销。

函数原型

我们模仿std::sort来进行开发。

template< class It, class Compare >
void sort …
more ...

"alloca" vs "placement new"

WHAT?!

For most time, we use malloc or new for memory allocation, which will get it on heap.

However, access memory on heap is not as effective as the memory on stack, because the heap is "free-floating region of memory". To the contrary, memory on stack is managed by CPU …

more ...