LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1475|回复: 13

[共享] 火星人看难懂的qt代码

 关闭 [复制链接]
发表于 2009-4-29 02:12:34 | 显示全部楼层 |阅读模式
在看qt的源代码时候,看到下面这段代码,第一反映是gcc会报错,可是我的qt编译通过了呀。
再仔细看看代码,效率真高,就是可读性差了点。
可能是我火星了,不过这种形式的代码还是第一次见到。


  1. const int count8 = (width8 + 3) / 4;
  2. ...

  3. if (count8) {
  4.     int n = count8;
  5.     switch (width8 & 0x03) // duff's device
  6.     {
  7.     case 0: do { *dest8++ = qt_convertToGray4<SRC>(src[0]) << 4
  8.                             | qt_convertToGray4<SRC>(src[1]);
  9.                  src += 2;
  10.     case 3:      *dest8++ = qt_convertToGray4<SRC>(src[0]) << 4
  11.                             | qt_convertToGray4<SRC>(src[1]);
  12.                  src += 2;
  13.     case 2:      *dest8++ = qt_convertToGray4<SRC>(src[0]) << 4
  14.                             | qt_convertToGray4<SRC>(src[1]);
  15.                  src += 2;
  16.     case 1:      *dest8++ = qt_convertToGray4<SRC>(src[0]) << 4
  17.                             | qt_convertToGray4<SRC>(src[1]);
  18.                  src += 2;
  19.     } while (--n > 0);
  20.     }
  21. }
复制代码
发表于 2009-4-29 08:59:43 | 显示全部楼层
以前在某处也见过类似的代码. 虽然看到后有种很崇拜的感觉, 可是心底还是告诫自己, 绝对不要写出这样的代码, 要不然同事们会杀了我
回复 支持 反对

使用道具 举报

发表于 2009-4-29 09:15:15 | 显示全部楼层
对于2D图形的处理,不得不为之啊,可以利用gcc的auto vectorization的编译选项来进行SIMD的加速。
回复 支持 反对

使用道具 举报

发表于 2009-4-29 12:12:15 | 显示全部楼层
个人倒是感觉当对效率的要求已经达到这种程度的时候, 嵌入两句汇编比什么都有效.

P.S. 突然注意到 realtang 兄的签名, 是在用 gtk/dfb 作为桌面么? 以前在开发板上试过, 好多声称依赖 gtk 的程序都实际依赖的是 gtk/X, 这样在软件兼容性上就会差很多, 虽然各个方面的软件总还找得到 gtk/dfb 下能用的, 但是还是觉得用 gtk/dfb 作为桌面好强.
回复 支持 反对

使用道具 举报

发表于 2009-4-29 13:27:59 | 显示全部楼层
其实并不仅仅是对效率的要求。
这种写法其实非常常见,看过一次之后第二次再看不会有任何疑惑。
主要难处其实只是从循环体外goto到循环体内而已。如果这个环节没有什么问题,看懂这个代码没什么难处吧。

当然有个重要的原因是:这个代码是一个非常标准的格式,在某些领域被广泛的使用,如果熟悉这种用法,它就是可读性最高的方式。视频编解码,流式拷贝,很多情况下这个都是个定约结构。

至于汇编,首先这种代码并没有到需要动用汇编的程度,其次,一旦动用汇编,就会是个相当庞大的工程:你必须把你所支持的数十种CPU平台的汇编代码全部写出来。而这绝大多数情况下限制了代码的可移植性。
回复 支持 反对

使用道具 举报

发表于 2009-4-29 22:15:08 | 显示全部楼层
Post by remote fish;1981042
个人倒是感觉当对效率的要求已经达到这种程度的时候, 嵌入两句汇编比什么都有效.

P.S. 突然注意到 realtang 兄的签名, 是在用 gtk/dfb 作为桌面么? 以前在开发板上试过, 好多声称依赖 gtk 的程序都实际依赖的是 gtk/X, 这样在软件兼容性上就会差很多, 虽然各个方面的软件总还找得到 gtk/dfb 下能用的, 但是还是觉得用 gtk/dfb 作为桌面好强.

还没能达到GTK/DFB桌面的程度,目标是这样。原因是x11跟xp比起来,太慢。
回复 支持 反对

使用道具 举报

发表于 2009-4-30 09:11:57 | 显示全部楼层
Post by poet;1981077
其实并不仅仅是对效率的要求。
这种写法其实非常常见,看过一次之后第二次再看不会有任何疑惑。
主要难处其实只是从循环体外goto到循环体内而已。如果这个环节没有什么问题,看懂这个代码没什么难处吧。

当然有个重要的原因是:这个代码是一个非常标准的格式,在某些领域被广泛的使用,如果熟悉这种用法,它就是可读性最高的方式。视频编解码,流式拷贝,很多情况下这个都是个定约结构。

至于汇编,首先这种代码并没有到需要动用汇编的程度,其次,一旦动用汇编,就会是个相当庞大的工程:你必须把你所支持的数十种CPU平台的汇编代码全部写出来。而这绝大多数情况下限制了代码的可移植性。


这样说来确实是很有道理. 我是做嵌入式开发的, 思维已经成定式了, 总是倾向于利用平台相关的特性, 所以很多时候看到在 C 级别拼死命地进行优化就会不太理解, 呵呵
回复 支持 反对

使用道具 举报

发表于 2009-4-30 09:20:59 | 显示全部楼层
Post by realtang;1981298
还没能达到GTK/DFB桌面的程度,目标是这样。原因是x11跟xp比起来,太慢。


x11 的结构如果不改变, 估计效率就永远是个问题.

不过 dfb 对显卡加速的支持能达到 x11 那样的程度么? 印象中 dfb 中是自己提供了各种卡的驱动, 但是应该达不到 nv/ati 官方闭源驱动那样好的驱动能力吧. dfb 的驱动结构与接口倒是不错, 比 x11 那种扩展套扩展的形式看起来更舒服一些, 对 argb 的原生支持也很诱人
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-30 10:21:10 | 显示全部楼层
前几周老板要我给sgx530写个dfb的驱动, 才开始看dfb, 感觉dfb的文档写的差一些,只好啃源码。现在有客户要qt的支持,只好将dfb放一放。不过感觉qt的技术文档好多了。
版大和鱼兄,以后我要多向你请教dfb的问题哦。
回复 支持 反对

使用道具 举报

发表于 2009-4-30 13:05:08 | 显示全部楼层
biinn 兄客气, 请教不敢当, 如果有帮得上忙的一定尽力而为
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表