我非常喜欢STL。它使编码算法非常方便,因为它提供了所有原语,如parition,find,binary_search,iterators,priority_queue等。另外你根本不用担心内存泄漏。
我唯一关心的是运营商重载的性能损失,这是实现STL工作所必需的。 为了比较,我认为它依赖于==提供所需的语义。如果我们将类添加到容器中,我们需要重载==运算符。
为方便起见,我失去了多少效率?
关于内存泄漏的另一个问题:
答案 0 :(得分:10)
在泛型类型上使用stl algortithms时,必须以某种方式提供比较逻辑。运算符重载没有任何其他函数的性能损失,并且可能(像任何其他函数一样)内联以删除任何函数调用开销。
许多标准容器和算法也使用std::less
,因此默认使用<
而不是==
。
标准容器本身不会泄漏,但您可以使用它们来保存对象(例如指针),这些对象不一定会清理它们拥有的内存。
在java中泄漏内存很困难,但这并不意味着你不会因为没有良好的对象所有权语义而陷入麻烦,并不意味着你不能用尽所有可用的内存和崩溃。
答案 1 :(得分:4)
我将把C ++的答案留给以前的海报,但100%是的,你可以在Java中记忆泄漏。除非你有一些好的内存分析工具可供查看,否则它往往很难找到。通常,当您反复实例化对象时,会发生自动垃圾收集语言(例如Java,Python等)中的内存泄漏,但是A.当您完成对象时,不会清除它们(例如,在调用“close”时)数据库连接)或B.继续持久存在指向它们的其他对象(例如Hashtables),以便自动垃圾收集器永远不会垃圾收集它们。
如果您的应用程序处于您认为应该是稳定状态的状态,那么您将获得其中一个:
http://java.sun.com/javase/6/docs/api/java/lang/OutOfMemoryError.html
你正在寻找一些有趣的调试工具;)
答案 2 :(得分:1)
由于运算符重载只会导致函数调用,并且您必须编写一个函数来完成工作,因此开销为零。运算符重载只是一个方便,所以你可以做x == y而不是x.equals(y)或x&lt; y而不是x.compaterTo(y)。编译器本质上生成类似:x。==(y)或x。&lt;(y)(不会编译,但你明白了)。
答案 3 :(得分:1)
“惩罚”实际上是一个奖励。
让我们采用最典型的算法,排序。 C没有运算符重载。因此,qsort
采用函数指针。每个比较使用间接函数调用(在运行时)。 C ++确实有运算符重载。对于std::sort
,每个比较都是直接调用(由链接器修复)或内联(通过编译器)。这远非有效。 std::sort
的速度比qsort
快6倍并不罕见。
通常,运算符重载使得表达类型的“默认”函数变得容易得多,其方式可以被其他代码和编译器利用。替代方案效率低得多。要么他们依赖宏(这会伤害程序员),要么他们依赖于函数指针(这会损害优化器和CPU。)
答案 4 :(得分:1)
我唯一关心的是运营商重载的性能损失,这是实现STL工作所必需的。为了比较,我认为它依赖于==提供所需的语义。如果我们将类添加到容器中,我们需要重载==运算符。
它不存在。您的重载运算符实现为函数调用。如果您没有重载运算符,则需要定义要使用的函数。因此,只需使用更清晰的语法,性能完全相同。
答案 5 :(得分:0)
What is the performance penalty of operator overloading STL
除此之外,你总是可以让你的运算符内联,甚至不会有函数调用的惩罚。