Duff的设备代码如何编译?
我明白为什么 Duff 的设备 比可以展开的普通循环代码更快,但是没有优化.但我还不明白如何编译代码.
我想这是关于 switch 语法的技巧.但现在不是了.
I understood why Duff's device is faster than normal loop code which can be unrolled but is not optimized. But I can't understand how the code can be compiled yet.
I guess it's a trick about the switch syntax. But not anymore.
switch句中怎么能存在do while句?很奇怪.
有谁可以解释一下吗?
How can do while sentence exist in switch sentence? Very weird.
Is there anyone who can explain this?
另一个问题.为什么 duff 使用 8?它可以是 16、65536 或其他.因为代码大小?还有别的原因吗?例如,缓存或流水线的好处.
Another question. Why did duff use 8? It could be 16, 65536 or whatever. Because of code size? Is there another reason? For example, cache or pipelining benefits.
推荐答案
为什么 Duff 的 Device 可以编译,一个简单的解释是 switch
语句的语法对于switch
语句块可能需要占用.在受控语句中有一些限制,以及在 switch
之外不允许的几件事(case
和 default
标签).但除此之外,受控语句只是任何其他语句,可能有标签供 switch
为目标.
A simple explanation of why Duff's Device compiles is that the syntax of the switch
statement isn't particularly specific about the form that the switch
statement block might need to take. There are a few restrictions, and a couple of things permitted in the controlled statement that aren't permitted outside a switch
(the case
and default
labels). But other than that, the controlled statement is just any other statement, with the likelihood that there are labels for the switch
to target.
这是来自 C99 的语法:
Here's the syntax from C99:
switch ( expression ) statement
除了语法之外,该标准还施加了一些限制:
Beyond the syntax, the standard imposes a few constraints:
- 控制表达式必须是整数类型
- VLA 可以在 switch 语句中出现的位置受到限制
case
标签表达式必须是整型常量表达式- 不能有重复的
case
标签表达式或default
标签
- the controlling expression must have an integer type
- there are restrictions about where VLAs can occur in the switch statement
case
label expressions must be integer constant expressions- there cannot be duplicate
case
label expressions ordefault
labels
除此之外,语句块中允许的任何构造都应允许在受控语句中(除了 case
和 default
标签都可以).请记住,case
和 default
只是开关根据控制表达式和 case
标签表达式跳转到的标签.正如 Potatoswatter 所说的,切换code> 只是一个计算出来的
goto
.所以就像 goto
可以跳到循环的中间一样,switch
也可以.
Other than that, any construct permitted in a statement block should be permitted in the controlled statement (with the addition that case
and default
labels are OK). Remember that case
and default
are just labels that the switch jumps to based on the controlling expression and the case
label expressions. As Potatoswatter says, switch
is just a computed goto
. So just like goto
can jump into the middle of a loop, so can switch
.
此外,我认为您可能会从 Duff 的设备中受益的情况在今天非常罕见(我认为即使在 1980 年代也很少见).不要忘记 Tom Duff 本人在他的 description 中说过以下内容:
Also, I think that the cases where you might see a benefit from Duff's Device are pretty rare today (I think they were rare even in the 1980's). Don't forget that Tom Duff himself said the following in his description:
- 恶心,不是吗?"
- 我对这一发现感到既自豪又厌恶."
与最初描述时相比,Duff 的设备应该被视为一种好奇心而不是使用的工具.
Even more than when it was initially described, Duff's Device should be considered more of a curiosity than a tool to use.
相关文章