2009年2月14日 星期六

Initialize Array

雖然說用平常建議使用initializer來初使化變數,但是如果遇到初使化一個很大的array的話,還是建議使用別的方法來初使化。讓我們來看一下底下的code:
int main(){
int arr[10] = {0};
// ...
return 0;
}
看起來沒什麼問題,但是如果我們再把array size從10改成1,000或是1,000,000或是更大,然後看一下compile出來的binary的大小,你就會發現大小差超多的! 雖然說平時沒事不太有機會宣告一個這麼大的array,不過如果真的遇到了,而binary的大小又是你的concern之一的話,建議改用下面的初使化方法,一是使用迴圈:
int main(){
int arr[1000000];
int i;
for( i=0; i<1000000; ++i )
arr[i] = 0;
return 0;
}
二是使用memset:
#include <cstring>
int main(){
int arr[1000000];
memset( arr, 0, sizeof(int)*1000000 );
return 0;
}
還是要再次提醒,畢竟這種狀況應該滿少的,平時的其他變數還是建議使用initializer。

2009年2月11日 星期三

Do NOT Extern an Inline Function

如果你在 a.cpp 裡宣告了
inline foo();
在b.cpp中,請不要使用extern,eg.
extern foo();
void bar() {
foo();
}
雖然在gcc/g++ compile會過,但是在其他compiler可能會fail。
這是因為inline function在compile時會embed進code裡,所以link的時候理論上會找不到這個symbol。
建議將function 寫在header中,使用include header的方法,eg.
#include"a.h"
比較好。

2009年2月9日 星期一

coding style 可以看作者的個性

最近寫code時,因為希望quality好一點,所以對很多parameter input & function return會做檢查,結果程式碼裡面就出現好多
if( false == func() ) {
// print error msg
return false;
}
之類的code,或是一堆 assert(a==b)之類的 ...
感覺好像矯枉過正?

寫程式果然是藝術,還可以看一個人的個性...
看得出來我的安全感很低 Orz