对于这个if语句,哪个表达更好?

时间:2012-11-03 04:12:53

标签: c++ ffmpeg rtmp

我被告知有一个针对ffmpeg的补丁修复了流式传输到FLV播放器时的问题。

rtmpproto.c 第2314行附近有以下表达式:

if (rt->flv_header_bytes < 11)
            break;

修复方法是将其更改为包含此附加要求:

if (rt->flv_header_bytes < 11 && !rt->flv_off)
            break;

但是我很好奇这句话的逻辑。第一个语句检查FLV标头是否小于11个字节,但是在检查标头的大小字节数之前检查flv流是否先打开是不是更有效?

if (!rt->flv_off && rt->flv_header_bytes < 11)
            break;

或者将语句更改为如此?

if (rt->flv_off || (!rt->flv_off && rt->flv_header_bytes < 11)
                break;

这会更有效还是会以某种方式破坏代码?

1 个答案:

答案 0 :(得分:1)

这取决于哪种情况最常失败,以及编译器是否遵守您键入条件的顺序。假设后者是真的(一个很大的假设),首先检查标题大小可能更有效,因为大概是FLV播放器通常是开启的。

更完整的评估需要更多具体内容......尽管这些都无论如何都不重要,因为(a)“浪费”的时间几乎肯定无关紧要;(b)编译器最有可能做得更好优化比你想象。

如果您想在第三个陈述中使用OR,只需应用DeMorgan定律并写下

if(rt->flv_off || rt->flv_header_bytes >= 11)

但同样,这不是真正需要担心的事情。