2012-05-16 71 views
2

瑣碎的解決辦法是:如何在C++中高效地實現無窮大和無窮大支持算術?

class Number 
{ 
public: 
    bool isFinite(); 
    bool isPositive(); 
    double value(); 

    ... 

private: 
    double value_; 
    bool isFinite_; 
    bool isPositive_; 

    ... 
}; 

令我擔心的事情是效率:

從有效的C++:55個具體辦法由Scott Meyers的提高您的程序和設計(第3版):

即使小對象具有廉價的拷貝構造函數,也可能存在性能問題。有些編譯器會以不同的方式處理內置和用戶定義的 類型,即使它們具有相同的基礎 表示形式。例如,一些編譯器拒絕將只包含一個雙精度值的對象 放入一個寄存器中,即使他們愉快地將放在那裏定期進行裸體加倍。當發生這種事情 發生時,通過引用 傳遞這樣的對象可能會更好,因爲編譯器肯定會將指針(實現 引用)放入寄存器中。

有沒有辦法繞過效率問題?例如一個使用匯編語言魔術的庫?

+0

您是否試過在程序集中查看您的編譯器是否正在生成您提到的腦死代碼? – Mysticial

+0

當你解決了性能問題後,我很好奇聽到你的算術運算在無窮大是操作數時會做什麼! – cheeken

+0

我是C++的初學者,幾乎不瞭解彙編語言。這些東西超出了我目前的能力。我只是希望有一個衆所周知的解決方案。 –

回答

6

對於double實現Number類沒有什麼理由。雙格式已經實現了Infinity,NaN和標牌作爲原始基本雙重類型的一部分。其次,你應該先爲你的正確性編寫你的代碼,然後再嘗試優化,此時你可以看看具體的數據結構的因素,並重寫代碼和算法。

現代編譯器通常在編寫優秀代碼方面非常高效,而且通常比大多數人類程序員做得更好。

+0

全部爲真;但是當您事先知道該程序必須很好地擴展時(例如多聲道聲音分析軟件包),您最好意識到潛在的瓶頸。 – xtofl

+0

@xtofl - 那麼我會建議只使用#define MACOS和模板類進行編程,並避免編譯器無法展開的任何數據結構。 – Soren

+1

謝謝索倫!我從未意識到這一點。它似乎可以像預期的那樣運用各種基本的數學函數。但是,這是標準的C++還是gcc編譯器的創造者投入的獎金? –

2

對於你的特定的例如,我只是使用雙打而不是在課堂上。他們很好地適應和定義處理無窮。

從更一般的意義上說,您應該使用簡單的解決方案,只考慮性能問題(或更有可能的情況下)。

這意味着對代碼進行測試並在許多您將要使用它的場景中進行測試。

如果它仍然在您的性能要求範圍內執行,請不要擔心嘗試對其進行優化。你應該一些性能要求稍微更具體的說,「我希望它儘可能快地運行」 :-)

記住效率並不總是意味着「儘可能快,不管成本」。它意味着實現你的目標,而不必犧牲其他事情(如可讀性或可維護性)。

如果您完成一項完整的操作,使用戶等待0.1秒,並將其優化到10倍的速度,那麼用戶根本就不會注意到(我說「完成」,因爲顯然,用戶如果在沒有某種臨時結果的情況下完成了一萬次,它們會發現它們之間存在差異)。

並記住,措施,不要猜測!