你写过很长的功能吗?如果是这样,为什么?

时间:2009-07-17 16:20:52

标签: c code-metrics

我正在撰写关于extremely long functions in the Linux kernel的学术项目。

为此目的,我正在寻找实例函数的例子,这些函数非常长(几百行代码),你不认为编程不好(即它们不会受益于分解或使用发送表)。

你有没有写过或看过这样的代码?你可以发布或链接到它,并解释为什么这么长?

我在这里得到了社区的惊人帮助 - 任何将被纳入项目的想法都将得到适当的记录。

谢谢,

乌迪

7 个答案:

答案 0 :(得分:10)

我写过的最长的函数都有一个共同点,一个非常大的switch语句。有时,当你必须打开一长串项目时,如果你试图将一些选项重构为一个单独的函数,那么只会让事情变得更难理解。使用大型switch语句会使Cyclomatic的复杂性达到顶峰,但它通常比替代实现更好。

答案 1 :(得分:4)

这是我被解雇前的最后一次。

答案 2 :(得分:3)

以前的工作:一个非常长的案例陈述,IIRC 1000+行。这在对象之前很久。每个选项只有几行。打破它会让它变得不那么清晰。实际上有一对这样的例程对同一个底层数据类型做了不同的事情。

抱歉,我不再拥有该代码,无论如何都不是我的帖子。

答案 3 :(得分:2)

我认为最糟糕的功能是自定义CPU VM的关键方法。与@epotter一样,这涉及一个大的switch语句。事实上,我会说很多方法,我发现拒绝被彻底分解或提高了可读性,涉及到switch语句。

答案 4 :(得分:1)

不幸的是,如果在使用某种代码生成器的构建步骤中自动生成这种类型的子例程,则通常不会在其中找到这种类型的子例程。

因此,寻找使用其他语言生成C的项目。

答案 5 :(得分:1)

除了性能之外,我认为内核空间中调用堆栈的大小是8K(请验证大小)。另外,据我所知,内核中的代码非常具体。如果某些代码在将来不太可能被重用,为什么还要考虑函数调用开销来使它成为一个函数。

答案 6 :(得分:0)

我可以想象当速度很重要时(例如在内核中持有某种锁)时,由于进行函数调用会产生开销,因此您不希望分解函数。编译时,必须将参数压入堆栈,并且必须在返回之前弹出数据。因此,出于效率原因,你可能会有很大的功能。