為了很多因素(降低Playform depdent / Optimization等。 GCC 跟 CLANG 都引進了一層中間層,這曾的目的是定義一個平台無關的指令集, 以老朋友hello來示範如何輸出中間產物。
1 |
|
為了很多因素(降低Playform depdent / Optimization等。 GCC 跟 CLANG 都引進了一層中間層,這曾的目的是定義一個平台無關的指令集, 以老朋友hello來示範如何輸出中間產物。
1 | #include <stdio.h> |
看到濟濟篇文章的總結,寫起來,免得忘了。
以下這段Code應該一堆人猜錯
1 | int i = 0; |
continue
會跳到邏輯判斷的地方,而不是Block的最前端。
sizeof是compile-time的operator,所以以下這段code的結果會是4 0
1 | int i = 0; |
另外sizeof在不同的地方會有不同的表現
1 | int arr[SIZE][SIZE][SIZE]; |
裡面最令人驚奇的是print_sizeof中的第一個輸出值是4,因為第一維的index是pointer。
1 | class A { |
這邊的輸出結果沒有呼叫A的Constructor,因為a只宣告沒定義。
需要加上
1 | A B::a; |
如果我們沒有加上定義,這樣子是沒有問題的。
1 | class B { |
因為A是個empty class
所以就算沒定義也沒問題,如果不是的話就會出現編譯錯誤。
這段Code沒有問題
1 | class A { |
因為member function不涉及這物件的屬性任何操作,因此什麼都沒發生。
參考docker-gitlab這個網頁,實際餐作一次。
1 | $ docker pull sameersbn/gitlab:latest |
1 | $ |
紀錄一下STL裡面常用的幾種iterator
顧名思義就是將容器從後面往前的順序訪問。
1 | #include <iterator> |
共分三種
vector deque list
deque list
1 | #include <iterator> |
C++11之後新增的,顧名思義就是加上move semantics,給個範例就很明顯了。
1 | #include <iostream> // std::cout |
雖然有用過libuv,不過Boost asio可能會成為下一代C++的標準配備,還是先熟悉一下。
Boost除了Network之外,還有其他很多功能,不過此次就先以Network作介紹。
它同時支援Sync / Async兩種方式,以下是個範例。
1 | #include <iostream> |
這兩個特色很少被提及,寫起來,免得忘了。
如何防止一個類別被繼承(雖然我想不到為什麼要這麼作),以前可以用虛擬繼承來防止。
1 | template <typename T> |
其中的MoreDerived就被編譯器禁止生成。不過這樣寫實在很麻煩,於是在C++11之後友更簡單的方式。
1 | class Base final { |
這邊只要加上final
關鍵自救能達到一樣的效果。等同於C#的sealed。
同樣的,C++11也從C#跟Java借鑒了不少特色
1 | class Base { |
override顧名思義就是檢查BaseClass之中,有沒有同樣Signature的函式宣告,如果沒有的話,就會爆錯。免得產生新的函數而不自知。
1 | class Base { |
在上面的例子中,可以看到Base沒有show(double)
這個Signature的宣告,因此Compiler會報錯。
因此我們可以透過 pure virtual function
在編譯時檢查每個subclass都有實做此函數,而用override來檢查這函數是在VTable中。
之前遇到一個使用情況,在unique_ptr已經存在於STL Container當中,想要把他從Container移除且回傳出被分離的unique_ptr,該怎麼做。
原來的想法很簡單,沒考慮太多
1 | #include <memory> |
注意要將unique_ptr從Container移出來需要用move,然後才能將其刪除。
Trait有很多種形式,Scala也有Trait。不過這邊講的是Rust的Trait。Scala的Trait觀念不太一樣。
一開始是看到這篇How are Rust Traits different from Go Interfaces?,後來發現跟C++觀念有點相近,於是一起比較。
trait長得很像Interface,不過方式不太一樣,會在編譯時期檢查資料型態。
1 | trait Foo { fn bar(&self); } |
安裝systemtap本身沒什麼,不過如何找到Debug info就沒這麼簡單了。
1 | $ sudo apt-get install systemtap |
以下是網路大神提供的懶人法
1 | $ wget http://www.domaigne.com/download/tools/get-dbgsym |
曾經試著自己編譯過,不過kernel mismatch,有時間再試吧。