C 程式設計妙計 奇技淫巧C 之懶惰計算

2021-08-22 06:54:28 字數 1933 閱讀 4125

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+,因此,先把表示式變形:

acce() + str_you + 「said: 」 + str_he + 「 said: @#$% 」 + str_i + 「said: over!」;

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

template

struct accelerate;

template

inline accelerate< accelerate< left >, right>

operator+(accelerate< left >& lsh, const right& rsh)

顯然,accelerate是輕量級的,現在考慮怎麼實現operator string () const呢?我的計畫是,首先計算出字串的總長度,然後開乙個足夠大的空間來複製字串,避免反覆分配記憶體:

operator string () const;

第一步,看看怎麼實現length:

struct empty{};

template

inline size_t length(const t& t)

template

inline size_t length(const accelerate& t)

template<>

inline size_t length(const accelerate& t)

}template< >

copy(rsh.begin(), rsh.end(), back_inserter(str));

}現在,我們整個計算的框架算是完成了,不過可真夠複雜的。注意觀察,實際上,accelerate利用多重繼承,把表示式轉換成乙個二叉樹,葉結點就是實際的字串。對於acce有如下定義:

typedef accelerateacce;

size_t length(const char* str)

template

size_t length(const char[size] str)

while(*src != 『』) str.push_back(*src++);

}效能分析:

string str;

str.reserve(length(left) + length(right));

C 之奇技淫巧

typedef struct data 0 pdata 0 typedef struct data 1 pdata 1 結構體data 0與data 1在性質上沒有什麼不同,它們的size是相等的,都是8.但在用法上有很大區別。例 pdata 0 stack0 pdata 0 malloc max ...

c 的奇技淫巧

關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...

C語言的一些奇技淫巧(1)巢狀語句

2.list for each safe 原始碼例子 參考此句中,i 3 是乙個語句,後面 是乙個復合語句 這句無論j 1 怎麼變,都是最後一句 true 為真。所以真正的還是前面i 3 成立即可 list for each safe iterate over a list safe against...