• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 奇技淫巧C++之懶惰計算[1]

    發表于:2007-05-14來源:作者:點擊數: 標簽:奇技淫巧C++懶惰String計算
    String result = str_you + “said: ” + str_he + “ said: @#$% ” + str_i + “said: over!”; 對于這樣一個語句,程序如何求值呢?假設str_you是一個典型s td ::string類型,這個語句需要做5 次operator+運算,多個string臨時對象,還極有可能的,多次的
        String result = str_you + “said: ” + str_he + “ said: @#$% ” + str_i + “said: over!”;

      對于這樣一個語句,程序如何求值呢?假設str_you是一個典型std::string類型,這個語句需要做5 次operator+運算,多個string臨時對象,還極有可能的,多次的內存分配操作。

      如果你的team leader對你說了類似話,兄弟,他是對你的代碼性能不滿呢。當然,聰明如你,一定會在上司找到你之前就發現了這里是個性能瓶頸,并且告訴他你正著手解決它呢。

      辦法是多種多樣的,最正確的辦法當然首先是看看設計上是否存在缺陷,并且可以修復以改善性能問題。假設,任何部分都很正確(我知道這不可能,一定有被你稱為菜鳥的同事干了蠢事,不是嗎?),責任只好落到你的肩上。打算怎么辦?

      我不知道你會怎么做,也許你會換一個更快的string,或者簡單調整一下語句:

        string result;
        result.reserve(1000);
        result += str_you; result += “said: ”;
        result += str_he; result += “ said: @#$% ”;
        result += str_i; result += “said: over!”;

      如果只有一兩個性能熱點,我打賭,我會這樣先嘗試一下。我認為這是一個很好的開始,我們已經認識到導致瓶頸的原因并且試圖消除它。你也可以這么做。 寫這篇文章,當然意味著還有別的方法,而且和懶惰計算有關。因為我們不能修改basic_string::的operator+,因此,先把表達式變形:

          Aclearcase/" target="_blank" >cce() + str_you + “said: ” + str_he + “ said: @#$% ” + str_i + “said: over!”;

      因為operator+從左向右結合,可以采用我們加速過的運算過程。先看最簡單的情況,和string相加。

        template<typename Left, typename Right>
        struct Accelerate{
         operator string () const;
         Left& left;
         Right& right;
        };
        template<typename Left, typename Right>
        inline Accelerate< Accelerate< Left >, Right>
        operator+(Accelerate< Left >& lsh, const Right& rsh)
        {
         return Accelerate< Accelerate< Left >, Right>(lsh, rsh);
        }

      顯然,Accelerate是輕量級的,現在考慮怎么實現operator string () const呢?我的計劃是,首先計算出字符串的總長度,然后開一個足夠大的空間來復制字符串,避免反復分配內存:

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>