5

我正在编写一个关于Linux 内核中极长函数的学术项目。

为此,我正在寻找非常长(几百行代码)的实际函数的示例,您不会认为它们是糟糕的编程(即,它们不会从分解或使用调度中受益桌子)。

你有没有写过或见过这样的代码?您能否发布或链接到它,并解释为什么它这么长?

我已经从这里的社区获得了惊人的帮助——任何将被纳入项目的想法都会得到适当的认可。

谢谢,

乌迪

4

7 回答 7

10

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

于 2009-07-17T16:35:27.190 回答
4

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

于 2009-07-17T17:46:51.617 回答
3

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

抱歉,我没有代码了,无论如何,我也不能发帖。

于 2009-07-17T16:44:35.517 回答
2

我认为不可怕的最长功能将是自定义 CPU VM 的关键方法。与@epotter 一样,这涉及到一个大的 switch 语句。事实上,我想说很多我发现抵制被彻底分解或提高可读性的方法都涉及到 switch 语句。

于 2009-07-17T17:09:09.540 回答
1

不幸的是,如果它是在构建步骤中使用某种代码生成器自动生成的,那么您通常不会发现这种类型的子例程签入或发布在某处。

因此,请寻找从另一种语言生成 C 的项目。

于 2009-07-17T17:35:39.720 回答
1

除了性能,我认为内核空间中调用堆栈的大小为 8K(请验证大小)。此外,据我所知,内核中的代码是相当具体的。如果将来不太可能重用某些代码,那么考虑到函数调用开销,为什么还要麻烦将其作为函数。

于 2009-07-17T18:25:15.500 回答
0

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

于 2009-07-17T16:57:22.120 回答