C++ 编写一个没有函数调用的算法是否合理?
我正在为一个库编写一个算法,我根本没有使用函数调用。C++ 编写一个没有函数调用的算法是否合理?,c++,optimization,C++,Optimization,我正在为一个库编写一个算法,我根本没有使用函数调用。 算法大约有100行,并且没有重复的代码。或者我应该使用内联吗 您的算法可读吗?也许将它分成几个函数将有利于可读性(因此也有利于可维护性),即使它不会减少重复;这意味着编译器可能会也可能不会内联代码 在您的情况下,编译器可能会忽略内联,因为它看起来像一个大函数。您的问题非常模糊,我能提供的最好答案是and。这实际上是两个问题: 对于单个函数/方法,100行是否太长,是否需要将其分解为子函数 是否值得考虑内联 答案是1。这要看情况而定。一般来说,
算法大约有100行,并且没有重复的代码。或者我应该使用内联吗 您的算法可读吗?也许将它分成几个函数将有利于可读性(因此也有利于可维护性),即使它不会减少重复;这意味着编译器可能会也可能不会内联代码
在您的情况下,编译器可能会忽略内联,因为它看起来像一个大函数。您的问题非常模糊,我能提供的最好答案是and。这实际上是两个问题:
答案是2。就是:不要过早地优化。首先进行概要分析,然后根据需要进行优化。有太多类似的问题需要链接到…大多数时候,如果我的算法超过20行,那么我使用的抽象级别是错误的。下一个错误修复将增加10行,下面的功能将增加40行的功能
然后最好将功能块移动到更小的函数中,以它们的功能命名。对我来说更好,因为它允许我将宏观行为的顺序等问题与微观行为分开。对于维护来说更好,因为您可以查看代码的全局结构,并放大感兴趣的部分。函数首先用于代码的可重用性。如果您没有任何重复代码,就不需要使用函数,只要考虑性能
<>你仍然可以考虑它的可读性。 < P> >强> 5 < /强>是合理的。但通常不是这样。如果有深度嵌套的循环和ifs,即方法中始终使用的变量,那么理解流程就困难得多。我会说,如果你在一个方法中有100行,你对算法没有很好的考虑。举个例子: 如果(x>y) z=x; 其他的 z=y; 当然,用z=max(x,y)表示更好;这些是算法中的模式,当发现并提取时,将使您的方法表达算法的意图,而不是实现细节
print max(x,y)
或
或
其中GetPreferredValue()只执行max(x,y),但它告诉您将要输出的内容。要确定100行算法是否正确,您应该问自己的问题是: 我的代码的所有部分的意图都很明显吗 如果你有一块,比如说,10行左右的代码,做了一些不明显的事情,那么把它放在一个函数中并给它一个好名字要比添加注释或者什么都不做要好得多
罗伯特·C·马丁(Robert C.Martin)的《干净的代码》是一本书,如果你发现自己不断地问自己这样的问题,你可能会想看看。嗯,冒泡排序算法不到100行,不使用任何函数调用,那么你为什么要:)
我的回答是,“是的,如果你认为这是最好的方法,写这样的算法是完全合理的” 不看代码,很难说。 一个可能有用的指南是查看您的代码,看看算法中是否有任何明显的阶段,特别是如果它们前面有标题注释。如果有,我发现消除标题注释并将其拆分为命名良好的函数通常更具可读性。唯一需要注意的是,您不应该向函数传递大量参数(可能不超过3个),因为这将破坏任何可读性优势
这假设算法不必尽可能快,但即使这样,内联通常也能做到这一点。一般来说,更喜欢可读性,并且记住函数是一种非常好的抽象形式。一般来说,不将代码分解为函数不会节省太多,只要这样做不会导致底层代码的编写次数超过其他方式。进入和退出功能的成本就是它的成本,通常并不重要,除非你以如此低的水平进入和退出功能,以至于它实际上占主导地位
函数调用的实际成本是,像信用卡一样,它们很容易调用,因此很容易花费超过必要的周期,特别是当它们发生在多个抽象层上时。如果没有重复的代码,你会内联什么?@xtofl:为什么?你让它更容易编辑给每个人吗?从什么时候开始100行函数变得太长了?我从来没有在备忘录上签字。哦,天哪。什么是对社区维基的痴迷?也许,当人们建议CW时,他们应该开始提供一个理由。这个问题是不是太没用了,以至于回答者都不配得到这个代表?CW对于幽默线索或民意测验类型的问题来说是有意义的,因为每个答案都有相同的价值,并且不涉及回答者的技能或知识。我不明白这里是怎么回事。我误解了维基的概念-我的错误。我总是很慢:(.有人在我前面发帖!太好了!)+1@Aviator:这是我经常遇到的情况……另一个共同点:)除了可重用性之外,函数在很多方面都很重要,来自Wikipedia的函数优势:-减少程序中的代码重复,-允许跨多个程序重用代码,-提高程序的可读性、可维护性和可扩展性,-将复杂的编程任务分解为si
print (x > y ? x : y)
print GetPreferredValue(x, y)