發表文章

目前顯示的是有「c」標籤的文章

if (a == true) 和 if (a) 是不同的,不要寫 if (a == true)

在Apple webkit的coding style裡就有一條說不要這樣寫 if (a == true) 和 if (a) 是不同的 (測試過C/C++, java script) 乍看之下,似乎只是多寫了 == true,有人認為這樣邏輯上比較清楚 (我不這麼認為) 實際上true會被轉換成1再比較,意義上不是a的boolean是否為true 如果你真的要跟1比較,請寫成 == 1 如果a是int的情況下,又是負數,例如 -1 if (a == true) 實際上是 if (-1 == 1), 不會進branch if (a) a不是0,會進去branch C/C++的慣例 boolean true定義為1,false定義為0 表示error code時成功用0,失敗用非零 (可能是正或負數,看API定義) 以語言的設計或定義,我覺得不寫 == true 才是比較好的寫法 一方面字數比較少,閱讀邏輯上也沒有比較差 我也沒看過哪個open source軟體寫== true (js似乎會寫 === true,不熟) 順便一提,我還看過 isXXX() ? true : false 的,這個語意上應該沒有差 直接寫isXXX() 不就好了? 理由一樣,養成好的習慣吧 一個簡單的C++驗證程式 #include <iostream> int main(int argc, char *argv[]) {         int a = -1;         if (a == true)                 std::cout << "a == true\n";         else            ...

Is it possible to store the address of a label in a variable and use goto to jump to it?

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html https://stackoverflow.com/questions/6421433/address-of-labels-msvc gcc有,MSVC不支援 只想拿來給switch case用 與其用enum存再switch,不如直接存address用goto,或許會稍微快一點? 沒研究過CPU branch prediction和indirect branch怎麼做的,無法確定 function pointer也能達成類似的效果,可是function call cost應該比較高

vector instrunctions

vector instrunctions 單位時間內比較耗電,產生較多熱量 Intel CPU workaround是把使用到的core降頻,減少熱量產生 是否會因為過熱降頻反而減少效能,需要實測才知道 AVX512的部分可以參考 https://lemire.me/blog/2018/09/07/avx-512-when-and-how-to-use-these-new-instructions/ 目前似乎不太推薦使用AVX512 AVX2也有類似的情況 舊型CPU降比較多,新的才會降比較少 AMD沒有這個問題,至少我的R5是這樣 因為Zen是用兩個cycle 128bit來做AVX2 (256bit),產生的熱沒那麼多 也許有降頻,沒有降到Intel那樣 還有一個問題,混用SSE2和AVX指令下會降低效能 (比只用SSE2還慢) 原因是CPU的狀態必須重置,會花費更多時間 (詳細的說明請自己去google) 不是說不能用SSE2指令,必須用AVX版本的SSE2指令 (叫做AVX-128?) compile成SSE2的和AVX的link起來,就無法避免這種情況發生 用設定強制支援AVX的用SSE2跑,或是重新compile成同樣版本指令集 https://software.intel.com/en-us/articles/avoiding-avx-sse-transition-penalties 看起來應該是同一個thread的程式內混用才有影響

Initialize handle

https://github.com/obsproject/obs-studio/pull/1519 有些function錯誤是return NULL不是INVALID_HANDLE_VALUE? 或是全部,我好像沒用INVALID_HANDLE_VALUE來initialize過

C/C++ 的差異

基本上C++是C的強化版,C能用的C++都可以 (有少數例外) C static function是指function只能在檔案的scope存在 C/C++ const convention https://en.wikipedia.org/wiki/Const_(computer_programming) C++變數可以要用再宣告,可以省記憶體 (也許程式沒執行到那邊),但降低可讀性 data和使用的地方接近也可增加效率 C要宣告在最前面 C才有VLA (Variable-length array) Names at file scope that are const and not extern have external linkage in C (as the default for all file-scope declarations), but internal linkage in C++. boolean C Bool, 4 bytes C++ bool, 1 byte

C/C++ malloc 只要失敗會crash就不用鳥,反正程式會自爆?

圖片
https://github.com/obsproject/obs-studio/blob/797b3dc1211c674ccf6cd8b162b144bb615bd233/libobs/util/darray.h#L398 static inline void darray_move_item(const size_t element_size, struct darray *dst, const size_t from, const size_t to) temp = malloc(element_size); temp會被拿去給memcpy用 總之OBS那邊的回應應該是不必處理就是了,教材一般不是這樣教的 想想是有幾分道理,也不是全部情況都適用 只要失敗的情況不會讓程式在不確定下運作就可以考慮忽略 不值得寫回復/重試機制的就讓它爆炸? performance critical部分就省略,否則會影響效能 畢竟失敗的情況下是少數,和影響效能相比哪個比較重要很清楚了

C99 VLA (variable-length array)

https://github.com/obsproject/obs-studio/pull/1465 OBS pr看到的,效能會比較差 (可簡化程式) C99必要,C11又改成非必要的功能 VLA長這樣 size_t dev_len = strlen(name) - 8; char device[dev_len];