簡體   English   中英

與將條件作為模板參數傳遞給sort()的比較導致比將條件函數指針傳遞給qsort()更少的開銷?

[英]Comparison with passing criteria as template parameter to sort() results in less overhead than passing criteria function pointer to qsort()?

在Stroustrup的C ++編程語言中,當他討論標准庫的設計時,他說,

例如,將比較標准構建為排序函數是不可接受的,因為可以根據不同的標准對相同的數據進行排序。 這就是為什么C標准庫qsort()將比較函數作為參數而不是依賴於固定的東西,比如<運算符。 另一方面,函數調用對每次比較施加的開銷會使qsort()作為構建塊進一步構建庫。

以上這些對我有意義。 但在第二段中,他說,

這個開銷嚴重嗎? 在大多數情況下,可能不是。 但是,函數調用開銷可能會占用某些算法的執行時間,並導致用戶尋找替代方案。 通過§13.4中描述的模板參數提供比較標准的技術解決了這個問題。

在§13.4中,比較標准被定義為具有靜態成員函數的類(進行比較)。 當這些類用作模板參數時,仍然通過其靜態成員函數進行比較。 在我看來,仍然會有調用靜態成員函數的開銷。

Stroustrup的意思是什么?

std::sort是一個函數模板。 在編譯期間,將為每個類型和比較運算符創建單獨的sort實例。 並且因為對於每個sort實例化,類型和比較器在編譯時是已知的,這允許內聯比較器功能並因此避免函數調用的成本。

理論上沒有理由說為什么sort需要比qsort更快。 有些編譯器甚至會將函數指針內聯傳遞給像' qsort這樣的函數:我相信我已經看過gcc或clang這樣做(不是qsort ),甚至在功能定義在不同的cpp文件中也是如此。

重要的是sort將函數對象作為類型和實例傳遞。 生成每種類型的不同函數: template s是函數的工廠。 在調用它時,調用的確切函數對於每個這樣的函數實例都很容易確定,因此內聯是微不足道的。

可以對函數指針執行相同操作,但需要從調用qsort的位置進行內聯,並仔細跟蹤函數指針的不變性,並知道它是從哪個函數開始的。 這在實踐中比上述機制脆弱得多。

類似問題出現了類似的問題(在sort數組時顯然是靜態的,使用qsort時更難處理)等。

通過指針調用函數有兩個開銷:指針解除引用和函數調用開銷。 這是一個運行時進程。

模板實例化由編譯器完成。 指針解除引用被消除,因為顯然沒有指針。 函數調用開銷由編譯器通過內聯調用進行優化。

暫無
暫無

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

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