我找到了一个实用的循环展开技术示例。
我认为Duff的设备是一个不错的提示 但是Duff's device's destination is never increased。对于将数据复制到串行设备而非普通程序员的嵌入式程序员来说,它可能很有用。
你能给我一个很好的有用的例子吗? 如果您曾在实际代码中使用它,那就更好了。
答案 0 :(得分:4)
最实用的技术是学习并喜欢编译器的优化选项,如果在分析中遇到热点,偶尔会手动检查生成的程序集。
答案 1 :(得分:1)
我不确定你的意思是“目的地永远不会增加。”
手动循环展开相当罕见。如今的嵌入式微处理器足够快,不需要这样的优化(并且会浪费宝贵的程序存储器)。
我在线性求解器内核中使用了Duff设备的变体。每个back_step
必须有一个fwd_step
,并且它们以四个为一组执行。
请注意,前向和后向循环由goto
实现。当跳过if
中的fwd_step
时,执行跳转到后向循环的中间。所以它真的是一种双Duff的设备。
这不是任何一种“实用”技术,它只是我能找到表达一些非常复杂的流量控制的最好方法。
switch ( entry ) {
#define fwd_step( index ) \
\
case (index): \
if ( -- count ) { \
...
startf:
fwd_step( 0 )
fwd_step( 1 )
fwd_step( 2 )
fwd_step( 3 )
stream = stream_back;
goto startf;
#define back_step( index ) \
.... \
} \
startb:
stream -= block_size;
back_step( 3 )
if ( ! -- countb ) break;
back_step( 2 )
if ( ! -- countb ) break;
back_step( 1 )
if ( ! -- countb ) break;
back_step( 0 )
if ( -- countb ) goto startb;
} // end switch
答案 2 :(得分:0)