how duffs device works
上次看到一段JS的代码觉得很酷,今天偶尔看到另一篇文章,讲的是原C版的Duff’s Device。自认为对C很有认识了,没想到这种诡异的写法还是难倒我了。现在才知道原来C的语法可以这么灵活。原文里给出了一个链接,是一个C的yacc语法文件。根据这个文件里switch和statement的描述可以很清楚的看出来,在switch中可以嵌入任何复杂的statement,而不仅仅是迭代语句。那到底生成的代码时怎么样的呢,它的工作原理在文章里已经进行了描述,但是想要知道到底是怎么样的,还是得看汇编,于是我将下面一段代码:
1 |
|
用clang -S -emit-llvm
反汇编了出来,核心的部分如下:
1 | %key = alloca i32, align 4 |
这个可读性还是很强的,基本上就是switch块和嵌入switch的循环被拆成两个独立的代码块,并且switch的分支语句会跳转到for循环体中带有相应label的部分。这个跳转只会影响for的第一次迭代,之后就是正常的循环了。另外,如果switch分支没有任何匹配的case,就会跳过整个循环(代码中switch的默认label是%19,对应函数的结尾处)。
这个技巧有什么用我也不知道,说不定什么时候能派上用场呢。