- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我读过 article on Wikipedia on the Duff's device ,我不明白。我真的很感兴趣,但是我已经读了好几遍那里的解释,但我仍然不明白 Duff 的设备是如何工作的。
更详细的解释是什么?
最佳答案
其他地方有一些很好的解释,但让我试一试。 (这在白板上要容易得多!)这是带有一些符号的维基百科示例。
假设您要复制 20 个字节。第一遍程序的流程控制是:
int count; // Set to 20
{
int n = (count + 7) / 8; // n is now 3. (The "while" is going
// to be run three times.)
switch (count % 8) { // The remainder is 4 (20 modulo 8) so
// jump to the case 4
case 0: // [skipped]
do { // [skipped]
*to = *from++; // [skipped]
case 7: *to = *from++; // [skipped]
case 6: *to = *from++; // [skipped]
case 5: *to = *from++; // [skipped]
case 4: *to = *from++; // Start here. Copy 1 byte (total 1)
case 3: *to = *from++; // Copy 1 byte (total 2)
case 2: *to = *from++; // Copy 1 byte (total 3)
case 1: *to = *from++; // Copy 1 byte (total 4)
} while (--n > 0); // N = 3 Reduce N by 1, then jump up
// to the "do" if it's still
} // greater than 0 (and it is)
}
现在,开始第二遍,我们只运行指示的代码:
int count; //
{
int n = (count + 7) / 8; //
//
switch (count % 8) { //
//
case 0: //
do { // The while jumps to here.
*to = *from++; // Copy 1 byte (total 5)
case 7: *to = *from++; // Copy 1 byte (total 6)
case 6: *to = *from++; // Copy 1 byte (total 7)
case 5: *to = *from++; // Copy 1 byte (total 8)
case 4: *to = *from++; // Copy 1 byte (total 9)
case 3: *to = *from++; // Copy 1 byte (total 10)
case 2: *to = *from++; // Copy 1 byte (total 11)
case 1: *to = *from++; // Copy 1 byte (total 12)
} while (--n > 0); // N = 2 Reduce N by 1, then jump up
// to the "do" if it's still
} // greater than 0 (and it is)
}
现在,开始第三遍:
int count; //
{
int n = (count + 7) / 8; //
//
switch (count % 8) { //
//
case 0: //
do { // The while jumps to here.
*to = *from++; // Copy 1 byte (total 13)
case 7: *to = *from++; // Copy 1 byte (total 14)
case 6: *to = *from++; // Copy 1 byte (total 15)
case 5: *to = *from++; // Copy 1 byte (total 16)
case 4: *to = *from++; // Copy 1 byte (total 17)
case 3: *to = *from++; // Copy 1 byte (total 18)
case 2: *to = *from++; // Copy 1 byte (total 19)
case 1: *to = *from++; // Copy 1 byte (total 20)
} while (--n > 0); // N = 1 Reduce N by 1, then jump up
// to the "do" if it's still
} // greater than 0 (and it's not, so bail)
} // continue here...
现在复制了 20 个字节。
注意:原始 Duff 设备(如上所示)已复制到位于 to
地址的 I/O 设备。因此,没有必要将指针 *to
递增。在两个内存缓冲区之间复制时,您需要使用 *to++
。
关于c - Duff 的设备是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514118/
我读过 article on Wikipedia on the Duff's device ,我不明白。我真的很感兴趣,但是我已经读了好几遍那里的解释,但我仍然不明白 Duff 的设备是如何工作的。
我已经尝试实现 Duff 设备,但它不工作。它不复制任何东西。我已经实现了原始版本和更清晰的版本: void duff_function(int *a, int *b, int length) {
许多年前,Tom Duff 在处理一个严格的图形 I/O 问题时展开了一个循环并创建了他的 Duff's Device如下: dsend(to, from, count) char *to, *fro
我读过 article on Wikipedia on the Duff's device ,我不明白。我真的很感兴趣,但是我已经读了好几遍那里的解释,但我仍然不明白 Duff 的设备是如何工作的。
我无法找到任何有关使用不同 Porter-Duff 模式合成位图的相对性能的互联网文章或 Google 文档。在编程时对我来说变得非常明显的是,传统的 SRC/DST 前缀模式比 Android Mo
我有以下布局: 和以下 myShape 可绘制对象:
我明白为什么 Duff's device比可以展开但未优化的普通循环代码更快。但是我还不明白代码是如何编译的。 我想这是关于 switch 语法的一个技巧。但现在不是了。 switch 句中存在do
来自 Zed Shaw 的艰难地学习 C,在练习 23 中,他谈到了 Duff 的设备。这是 Duff 的 Device 以供引用: int duffs_device(char *from, char
使用现有的 Sun 1.6 编译器和 JRE/JIT,使用 Duff 的 Device 示例的那种广泛展开来展开循环是个好主意吗?或者它最终会成为没有性能优势的代码混淆? 我使用的 Java 分析工具
我正在尝试解决 android ColorFilters 的问题。文档很差,所以主要方法是尝试不同的变体。 问题: 有一个位图。一些像素的 alpha=255,其他像素的 alpha=0。我正在尝试绘
我这里有一个循环,我想让它运行得更快。我正在传递一个大数组。我最近听说Duff's Device 可以应用于这个for循环吗?有什么想法吗? for (i = 0; i < dim; i++) {
我们知道 Duff's device利用 fallthrough switch 和循环的交错结构,例如: send(to, from, count) register short *to, *from
我正在编写一个性能要求很高的程序,并且一直在使用 C,但有人告诉我函数式编程有多酷,所以我决定用 F# 重写它。 无论如何,我在 F# 中难以复制算法的特定功能是 Duff's device .它不是
我有一个 iPhone 应用程序,它通过 CoreGraphics 混合两个 UIImage 对象来进行图像处理,特别是 CGContextSetBlendMode。我目前正在研究将其移植到 Andr
这个问题在这里已经有了答案: How does Duff's device work? (11 个答案) 关闭2 年前。 void Send(int * to, const int* from, c
我正在尝试在折叠工具栏的动画期间以编程方式更改后退按钮的颜色。我希望它在展开时是全白的,并且在折叠时具有应用程序默认的后退按钮颜色,这是一种带有 alpha 的颜色(50% 时为黑色)。 我发现的所有
iOS SDK 中有Porter-Duff 合成操作吗? 基于 12 种 Porter-Duff 合成操作。 最佳答案 iOS CoreGraphics 框架支持以下类型的混合模式,包括 Porter
我在 C 中有这种 Duff 的设备,它工作正常(将文本格式设置为货币): #include #include char *money(const char *src, char *dst) {
在 iOS 的 Metal 应用程序中,我需要渲染附加到简单四边形的半透明纹理。我无法找出正确的 colorAttachment rgb 和 alpha 混合因子。 我的设置: 1) 在 Photos
直到昨晚我才遇到好奇Duff's device首次。我一直在阅读它,我认为理解它并不难。我很好奇的是奇怪的语法(来自维基百科): register short *to, *from; register
我是一名优秀的程序员,十分优秀!