簡體   English   中英

操作員重載STL的性能損失是多少

[英]What is the performance penalty of operator overloading STL

我非常喜歡STL。 它使編碼算法非常方便,因為它為您提供了所有原語,例如,分區,查找,binary_search,迭代器,priority_queue等。此外,您完全不必擔心內存泄漏。

我唯一關心的是要使STL工作所需的運算符重載性能損失。 為了進行比較,我認為這取決於==提供所需的語義。 如果要將類添加到容器中,則需要重載== operator。

我為這種便利而損失了多少效率?

關於內存泄漏的另一個問題:

  1. 使用STL容器時是否會發生內存泄漏?
  2. Java是否會發生內存泄漏?

在泛型類型上使用stl算法時,必須以某種方式提供比較邏輯。 運算符重載不會對任何其他函數造成性能損失,並且可以像其他任何函數一樣內聯以消除任何函數調用開銷。

許多標准容器和算法也使用std::less ,因此默認情況下<而不是==

標准容器本身不會泄漏,但是您可以使用它們來容納不一定清除其“擁有”內存的對象(例如指針)。

很難在Java中泄漏內存,但這並不意味着您不會因缺乏良好的對象所有權語義而陷入麻煩,也不意味着您無法耗盡所有可用的內存並導致崩潰。

我將把C ++答案留給以前的海報,但100%是的,您可能會在Java中發生內存泄漏。 除非您有一些不錯的內存分析工具可以查看,否則也很難找到它。 通常,當您重復實例化對象時,會發生自動垃圾回收語言(例如Java,Python等)中的內存泄漏,但是A.在完成對對象的處理后(例如在調用“ close”時不清除它們)數據庫連接)或B.繼續保留指向它們的其他對象(例如Hashtables),以便自動垃圾收集器永遠無法對其進行垃圾收集。

如果您的應用程序處於您認為應該處於穩定狀態的狀態,那么您將獲得以下之一:

http://java.sun.com/javase/6/docs/api/java/lang/OutOfMemoryError.html

您正在進行一些有趣的調試;)

由於運算符重載只會導致函數調用,並且您必須編寫一個函數來完成工作,因此開銷為零。 運算符重載只是一種便利,因此您可以執行x == y代替x.equals(y)或x <y代替x.compaterTo(y)之類的操作。 編譯器本質上會生成類似x。==(y)或x。<(y)的東西(雖然不會編譯,但是您可以理解)。

“罰款”實際上是一種獎金。

讓我們以最典型的算法進行排序。 C沒有運算符重載。 結果, qsort了一個函數指針。 每個比較都使用一個間接函數調用(在運行時)。 C ++確實有運算符重載。 對於std::sort ,每個比較都是直接調用(由鏈接器固定)或內聯(由編譯器)。 這是非常有效的。 std::sortqsort快6倍並不罕見。

通常,運算符重載使類型的“默認”函數的表達變得容易得多,其方式可以被其他代碼和編譯器利用。 替代方案的效率要低得多。 他們要么依賴宏(對程序員不利),要么依賴函數指針(對優化程序和CPU不利)。

我唯一關心的是要使STL工作所需的運算符重載性能損失。 為了進行比較,我認為這取決於==提供所需的語義。 如果要將類添加到容器中,則需要重載== operator。

它不存在。 重載的運算符通過函數調用實現。 而且,如果您沒有重載運算符,則需要定義一個函數來代替。 因此,使用更簡潔的語法,性能完全相同

操作員重載STL的性能損失是多少

除此之外,您始終可以讓您的操作員內聯,這甚至不會帶來函數調用的損失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM