http://blog.csdn.net/hguisu/article/details/7453390
http://www.cppblog.com/tx7do/archive/2010/06/11/117609.html