我對Rust也是初學者的狀態,以下是從A 30 minute introduction to Rust看來的,既然Rust被定位成System programming language,難免要拿來跟C++比一比。看看Ruat友什麼特別之處。
The power of ownership
在C/C++,很簡單可以寫出這樣的程式碼。
1 | int* dangling(void) |
我對Rust也是初學者的狀態,以下是從A 30 minute introduction to Rust看來的,既然Rust被定位成System programming language,難免要拿來跟C++比一比。看看Ruat友什麼特別之處。
在C/C++,很簡單可以寫出這樣的程式碼。
1 | int* dangling(void) |
由於現在CPU對於Memory Byte Algined的處理較好,所以很多資料結構的擺法都會偏向於4 Byte Alginment的方式進行。例如
1 | struct string_t { |
string_t的大小為8,而非眾人想像中的5,如果要強制讓這個Structure大小為5的話,可以採用以下這種方式。
1 | // GCC Style |
如果不用這兩種方式的話,如何使用投機的方式來減少分配
1 | #include <stddef.h> |
其實上面那個char val[1]也是不需要的,在支援zero array之後,用這個方式更簡單
1 | struct string_t { |
簡單做一下筆記。
這篇是Concurrency in C++11的部份筆記,先寫有關C++11標準的部份。
future, promise被加入C++11,大概等同於C#的Task或是Java8的Future。
以讀寫一個檔案作為範例
1 | vector<char> readFile(const string& inPath) |
如果要拷貝一個檔案,可以這樣寫。
1 | size_t sync_copyFile(const string& inFile, const string& outFile) |
這樣寫得問題在於,讀寫都是同步動作。如果檔案一大,就什麼事都不用做了。如何使用Multithread來感善動作。
顧名思義,提供函數一部分的參數。變成一個新的函數。
最簡單的例子就像這樣
1 | int sub(int a, int b) |
當然上面這種寫法復用度並不高,於是在C++11把bind跟function納入標準配備之後,可以寫成這樣。
1 | std::function<int(int)> sub2 = std::bind(sub, std::placeholders::_1, 2); |
有時間再來討論bind跟function。
不過就可讀性來說,Pyhton版的強多了
1 | import functools |
Currying是為了解決不一樣的問題
假設一個函數有多個參數,把他轉化成多個只有一個參數的函數組合。
用C++11的Lambda Expression來做示範。
1 | std::function<int(int)> add2(int a) |
基本上PCurrying可以實現一部分Partion Application的應用。不過以上麵的sub2
為例,Currying在這邊就不是用。
更清楚的描述可以看What is the difference between currying and partial application
不定期更新
在Stackoverflow看到這串討論很有意思。
以下的Code,雖然時間複雜度都一樣O(n),不過排序過後的速度遠遠超過沒排序,將sort註解掉之後可以看出很明顯的差異。
1 | #include <algorithm> |
寫起來,免得忘記。
1 | void dump(int signo) |
對最近的心得做個總結。
這篇Boost application performance using asynchronous I/O描述了幾種常用的IO Model。
首先要先解釋兩個很像,卻又部太相同的名詞
最常見的I/O Model,就是在Event未結束前不會將控制權交還給Application。
1 | int len = recv(s, .....); |
在這種Model之下,為了要解決Blocking的問題,就得使用Multi-Porcess或是Multi-Thread的方式來做。