http://www.boost.org/index.htm
It is a recommended upgrade for all users of Boost 1.34.0
那些新的lib還沒被納入,例如asio等。據mail-list上的可靠消息指出,要等到1.35.0才會加進來......
2007年7月25日 星期三
2007年7月24日 星期二
How to interpret complex C/C++ declarations
http://www.codeproject.com/cpp/complex_declarations.asp
C時代的指標已經夠複雜了, C++時代又加入了const和reference這兩個東西, 事情愈來愈複雜了。
int const * n;
像const被塞在中間, 我想初學者一定會很不確定說這個const到底是修飾int, 還是指標? 上面那篇文章提了一個"讀懂宣告"的秘訣......就是由右往左讀。所以, n是一個指標指向一個const int。
int *&p;
那這個呢? 一樣由右往左讀, p是一個reference參考到一個int指標。
const char * const * const s;
這個例子就比較極端了......正常情況下應該要避免這種複雜的宣告。但是, 還是給他解讀一下, s是一個const pointer to const pointer to const char。這個宣告等於下面這個宣告:
char const * const * const s;
const char變成char const而已, 不過這樣的宣告方式就讓由右向左的讀法比較通順了, 所以, 宣告的時候要盡量寫成這種讀起來比較通順的style。
C時代的指標已經夠複雜了, C++時代又加入了const和reference這兩個東西, 事情愈來愈複雜了。
int const * n;
像const被塞在中間, 我想初學者一定會很不確定說這個const到底是修飾int, 還是指標? 上面那篇文章提了一個"讀懂宣告"的秘訣......就是由右往左讀。所以, n是一個指標指向一個const int。
int *&p;
那這個呢? 一樣由右往左讀, p是一個reference參考到一個int指標。
const char * const * const s;
這個例子就比較極端了......正常情況下應該要避免這種複雜的宣告。但是, 還是給他解讀一下, s是一個const pointer to const pointer to const char。這個宣告等於下面這個宣告:
char const * const * const s;
const char變成char const而已, 不過這樣的宣告方式就讓由右向左的讀法比較通順了, 所以, 宣告的時候要盡量寫成這種讀起來比較通順的style。
2007年7月11日 星期三
2007年7月9日 星期一
Boost Pointer Container
http://www.boost.org/libs/ptr_container/doc/ptr_container.html
顧名思義就是存放pointer的container,exception-safe。以前我們會用這樣的方法來存放pointer:
std::vector<MyClass*> myvector;
myvector.push_back(new MyClass());
myvector[0]->do_something();
上面這段code還沒寫完喔,因為我們存的是pointer,所以之後還要去注意釋放那些pointer所allocate的memory。
現在Boost Pointer Container裡面有個ptr_vector可以對應std::vector
boost::ptr_vector<MyClass> myvector;
myvector.push_back(new MyClass());
myvector[0].do_something();
code有點不一樣,可以看到的是,我們無法從Pointer Container取回pointer了,這可以避免一些意外情況發生。另外,所有的Pointer Container都會在解構時自動釋放pointer所佔的記憶體。
看到這邊有人可能會想:不過是自動釋放記憶體嘛......我自己寫code都很細心,都會注意memory的釋放,這個pointer container沒多大用處嘛。不過,Pointer Container最重要的重點是exception-safe,何謂exception-safe?參考下面這一段code:
在exception發生時,還沒到釋放memory的地方就跳出function了,這裡就會造成memory leak。雖然我們可以在catch裡都加上處理記憶體問題的code,但這樣的作法可能會非常的tedious(沒有人會想在每個catch裡都寫一次release memory的code吧?)。所以,有人會用std::auto_ptr或boost::shared_ptr這種smart pointer來解決這種問題:
std::vector<boost::shared_ptr<MyClass> > myvector;
C++ exception handling保證跳出function以前,所有的stack object都會被正常清除。所以上述的smart pointer都能夠保證在exception發生時,自動釋放pointer所指的memory。不過,使用smart pointer會多出一些overhead,而Pointer Container內部的實做則是直接將指標轉換成void*來儲存,顯然比smart pointer的效率要高。
基本上每個STL container在Boost Pointer Container都有互相對應的類別可以使用,例如vector對應ptr_vector,map對應ptr_map,操作方法也一樣,還擴充了一些便利的方法,例如我們可以直接用ptr_map.insert(k, v),不必像以前的std::map還要先create出一個pair object。
顧名思義就是存放pointer的container,exception-safe。以前我們會用這樣的方法來存放pointer:
std::vector<MyClass*> myvector;
myvector.push_back(new MyClass());
myvector[0]->do_something();
上面這段code還沒寫完喔,因為我們存的是pointer,所以之後還要去注意釋放那些pointer所allocate的memory。
現在Boost Pointer Container裡面有個ptr_vector可以對應std::vector
boost::ptr_vector<MyClass> myvector;
myvector.push_back(new MyClass());
myvector[0].do_something();
code有點不一樣,可以看到的是,我們無法從Pointer Container取回pointer了,這可以避免一些意外情況發生。另外,所有的Pointer Container都會在解構時自動釋放pointer所佔的記憶體。
看到這邊有人可能會想:不過是自動釋放記憶體嘛......我自己寫code都很細心,都會注意memory的釋放,這個pointer container沒多大用處嘛。不過,Pointer Container最重要的重點是exception-safe,何謂exception-safe?參考下面這一段code:
void func()
{
std::vector<MyClass*> myvector;
myvector.push_back(new MyClass());
try
{
// Exceptions may occur here
}
catch(...)
{
throw;
}
// I'm a good programmer
delete myvector[0];
}
在exception發生時,還沒到釋放memory的地方就跳出function了,這裡就會造成memory leak。雖然我們可以在catch裡都加上處理記憶體問題的code,但這樣的作法可能會非常的tedious(沒有人會想在每個catch裡都寫一次release memory的code吧?)。所以,有人會用std::auto_ptr或boost::shared_ptr這種smart pointer來解決這種問題:
std::vector<boost::shared_ptr<MyClass> > myvector;
C++ exception handling保證跳出function以前,所有的stack object都會被正常清除。所以上述的smart pointer都能夠保證在exception發生時,自動釋放pointer所指的memory。不過,使用smart pointer會多出一些overhead,而Pointer Container內部的實做則是直接將指標轉換成void*來儲存,顯然比smart pointer的效率要高。
基本上每個STL container在Boost Pointer Container都有互相對應的類別可以使用,例如vector對應ptr_vector,map對應ptr_map,操作方法也一樣,還擴充了一些便利的方法,例如我們可以直接用ptr_map.insert(k, v),不必像以前的std::map還要先create出一個pair object。
2007年7月4日 星期三
ClickClickClick的後續......
Click*3續觀察 : 圖形驗證與網路分工
Mr./Ms. Days上的一篇文章,詳細的解說了各個兵器的技術細節。
原本以為只是一個無聊遊戲,就像以前有一個自動練功的online game,只要掛著縮小到系統列就會自動升級,非常的空虛......那時候剛開始也是很流行,不過沒多久鄉民們就玩膩了。這次的click*3巧妙的把競爭層級拉到國與國之間的戰爭,因此在民族情感的發酵作用下,各國鄉民(宅宅?)們前仆後繼,就算是如此空虛的滑鼠點擊比賽也一直樂此不疲。
值得一提的是,網站主人並沒有刻意限制web robot(或許這才是他的目的?),於是讓各方人馬相繼開發出各種不錯的自動化兵器,看起來還蠻有趣的耶。真希望我還是學生,那我就有時間可以來玩玩這個了......
Mr./Ms. Days上的一篇文章,詳細的解說了各個兵器的技術細節。
原本以為只是一個無聊遊戲,就像以前有一個自動練功的online game,只要掛著縮小到系統列就會自動升級,非常的空虛......那時候剛開始也是很流行,不過沒多久鄉民們就玩膩了。這次的click*3巧妙的把競爭層級拉到國與國之間的戰爭,因此在民族情感的發酵作用下,各國鄉民(宅宅?)們前仆後繼,就算是如此空虛的滑鼠點擊比賽也一直樂此不疲。
值得一提的是,網站主人並沒有刻意限制web robot(或許這才是他的目的?),於是讓各方人馬相繼開發出各種不錯的自動化兵器,看起來還蠻有趣的耶。真希望我還是學生,那我就有時間可以來玩玩這個了......
2007年7月2日 星期一
青山瀑布
訂閱:
文章 (Atom)