re: C++下垃圾回收器的實現(一) 尹東斐 2010-02-08 17:25
@Bill Gates
我之前提到這個Hans_Boehm GC, 它由于是Conservative Garbage Collector,所以沒有辦法證明其絕對安全。
他的算法通過指針的地址判斷指針是否在堆上,重載全局new以后,他控制了所有內存分配,他知道堆上最小的地址和最大的地址,然后通過判斷指針的地址是否落在在個區域內部來判斷這個指針在堆上還是棧上。
這種方法沒辦法實現內存緊縮的功能。
還有,在工程中,用到其他庫的的時候都會考慮包裝,一般不會直接使用,加一個間接層,即使它的內存不完全由你控制,但是你還是可以部分控制的。
我之前提到這個Hans_Boehm GC, 它由于是Conservative Garbage Collector,所以沒有辦法證明其絕對安全。
他的算法通過指針的地址判斷指針是否在堆上,重載全局new以后,他控制了所有內存分配,他知道堆上最小的地址和最大的地址,然后通過判斷指針的地址是否落在在個區域內部來判斷這個指針在堆上還是棧上。
這種方法沒辦法實現內存緊縮的功能。
還有,在工程中,用到其他庫的的時候都會考慮包裝,一般不會直接使用,加一個間接層,即使它的內存不完全由你控制,但是你還是可以部分控制的。
re: 自動求導模板庫 尹東斐 2009-12-07 11:10
下載的文件放在和其他程序文件相同的目錄下,然后#include“ad.h”
要不你可以放在其他文件下,然后#include “xxx/ad.h"
具體用法參見前面的example。
要不你可以放在其他文件下,然后#include “xxx/ad.h"
具體用法參見前面的example。
re: 最長運行時間(百度筆試題) 尹東斐 2009-10-15 11:12
@wulin
不需要考慮存儲程序的空間,因為數據和程序在內存中完全沒有區別。所以從某種角度來看,程序也是數據的一種。
不需要考慮存儲程序的空間,因為數據和程序在內存中完全沒有區別。所以從某種角度來看,程序也是數據的一種。
re: C++基于類似反射機制的XML序列化和反序列化完成 尹東斐 2009-06-29 16:48
比如:
class A
{
public:
int i;
};
VL_BEGIN_INSPECTOR_DECLARATION
VL_BEGIN_BASE_CLASS(A)
VL_ADD_CLASS_MEMBER(i)
VL_END_CLASS(A)
VL_END_INSPECTOR_DECLARATION
A a;
現在我要通過類似 int x = func(a, "i"); 來的到a中i的值,那這個時候,怎么知道i的類型呢?也就是說func的返回值是從哪里來的?
不吝賜教~
class A
{
public:
int i;
};
VL_BEGIN_INSPECTOR_DECLARATION
VL_BEGIN_BASE_CLASS(A)
VL_ADD_CLASS_MEMBER(i)
VL_END_CLASS(A)
VL_END_INSPECTOR_DECLARATION
A a;
現在我要通過類似 int x = func(a, "i"); 來的到a中i的值,那這個時候,怎么知道i的類型呢?也就是說func的返回值是從哪里來的?
不吝賜教~
re: C++基于類似反射機制的XML序列化和反序列化完成 尹東斐 2009-06-29 16:43
@陳梓瀚(vczh)
>>VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的類型,這個用模板就可以了。
這個用模板也做不到吧? 除非有typeof之類的操作符,否則拿不到類型的呀。
>>VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的類型,這個用模板就可以了。
這個用模板也做不到吧? 除非有typeof之類的操作符,否則拿不到類型的呀。
re: C++基于類似反射機制的XML序列化和反序列化完成 尹東斐 2009-06-29 15:05
這實現看起來很有誘惑力 :0
有點不太懂,請指教:
136 VL_BEGIN_BASE_CLASS(Animal)
137 VL_ADD_CLASS_MEMBER(Age)
138 VL_ADD_CLASS_MEMBER(Weight)
139 VL_END_CLASS(Animal)
在VL_ADD_CLASS_MEMBER的時候,沒有涉及到成員的類型,那么當讀取數據的時候,類型是怎么得到的?
GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));
你在這里用到了Type.Object(),我想問你是不是把所有類型都包裝起來了,相當于每個類型都有個get_type()之類的方法,如果你是這么實現的,那就沒有問題了。如果不是的話,
197 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(L"VL_ObjectType");
188 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());
我想這兩句的作用應該是一樣的,只不過VL_InspectorSelector<Animal>是在宏里面特化的,L"VL_ObjectType"是你為所有“內建”類型寫的。
難道Inspector里面包含有每個成員的類型?
有點不太懂,請指教:
136 VL_BEGIN_BASE_CLASS(Animal)
137 VL_ADD_CLASS_MEMBER(Age)
138 VL_ADD_CLASS_MEMBER(Weight)
139 VL_END_CLASS(Animal)
在VL_ADD_CLASS_MEMBER的時候,沒有涉及到成員的類型,那么當讀取數據的時候,類型是怎么得到的?
GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));
你在這里用到了Type.Object(),我想問你是不是把所有類型都包裝起來了,相當于每個類型都有個get_type()之類的方法,如果你是這么實現的,那就沒有問題了。如果不是的話,
197 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(L"VL_ObjectType");
188 VL_ObjectInspector::Ptr Inspector=Manager->GetInspector(VL_InspectorSelector<Animal>::GetID());
我想這兩句的作用應該是一樣的,只不過VL_InspectorSelector<Animal>是在宏里面特化的,L"VL_ObjectType"是你為所有“內建”類型寫的。
難道Inspector里面包含有每個成員的類型?
re: 類實例能做做模板參數嗎? 尹東斐 2009-06-04 23:52
@hdqqq
嗯,謝謝,領教了。
嗯,謝謝,領教了。
re: 類實例能做做模板參數嗎? 尹東斐 2009-06-02 20:20
@hdqqq
樓上eXile說了,這個類型是叫函數類型的,但是它不能被實例化。也就是你的type_func。
樓上eXile說了,這個類型是叫函數類型的,但是它不能被實例化。也就是你的type_func。
re: Rvalue References: C++0x Features in VC10 (一) 尹東斐 2009-05-28 16:37
@飄飄白云
我只是覺得這個rvalue reference是最重要的特性,可以不知不覺的增加效率,所以就決定寫點什么。
我只是覺得這個rvalue reference是最重要的特性,可以不知不覺的增加效率,所以就決定寫點什么。
re: 【譯】VC10中的C++0x特性:Lambdas,auto,以及 static_assert 尹東斐 2009-05-28 14:37
恩,你全文翻譯了,敬佩中,這三篇雖然看了,我覺得rvalue reference比較有意思。
當然樓上說這些特性微不足道,是因為他還沒到能看出來這些特性強大之處的境界~~
不過不知道為啥vc10不支持conception,這個鄙人認為是最強大的特性之一了,有了這個,就可以和那種上百KB的error message說再見了。
當然樓上說這些特性微不足道,是因為他還沒到能看出來這些特性強大之處的境界~~
不過不知道為啥vc10不支持conception,這個鄙人認為是最強大的特性之一了,有了這個,就可以和那種上百KB的error message說再見了。
re: 類實例能做做模板參數嗎? 尹東斐 2009-05-27 14:04
@hdqqq
在模板的位置上,它的確是個類型,但是我不知道你想說明什么?
整篇文章,我都在嘗試說明在模板參數的位置上,std::string()只是個標記,純粹用作類型推導,只是這種寫法很容易會誤導人讓人認為那是個構造函數。而這個誤導源自于 return type deduction,因為在新的C++0x中,可能會有
int Test()
{
return 3;
}
type(Test()) i = 8;
如果這個被實現的話(vs2010已經有auto了,我想這個應該不遠了).編譯器可以做返回類型推導,那么在模板參數的位置上,寫函數調用也就不足為奇了。
所以,這篇文章主要想說明,到目前為止,函數返回類型是推導不出來,而類似std::string()的寫法只是個折中方案而已。
當然不是構造函數調用。
在模板的位置上,它的確是個類型,但是我不知道你想說明什么?
整篇文章,我都在嘗試說明在模板參數的位置上,std::string()只是個標記,純粹用作類型推導,只是這種寫法很容易會誤導人讓人認為那是個構造函數。而這個誤導源自于 return type deduction,因為在新的C++0x中,可能會有
int Test()
{
return 3;
}
type(Test()) i = 8;
如果這個被實現的話(vs2010已經有auto了,我想這個應該不遠了).編譯器可以做返回類型推導,那么在模板參數的位置上,寫函數調用也就不足為奇了。
所以,這篇文章主要想說明,到目前為止,函數返回類型是推導不出來,而類似std::string()的寫法只是個折中方案而已。
當然不是構造函數調用。
re: 類實例能做做模板參數嗎? 尹東斐 2009-05-25 19:08
@hyrish
你說的那種是函數模板,函數模板的模板參數可以靠編譯器自動推導,以類型明確的變量為基礎。而在類模板中,只能事先聲明,然后使用,編譯器無法推導。
你說的那種是函數模板,函數模板的模板參數可以靠編譯器自動推導,以類型明確的變量為基礎。而在類模板中,只能事先聲明,然后使用,編譯器無法推導。
re: 統計map中key小于某類型變量的個數 尹東斐 2009-05-02 23:18
這個解法很好,在lambda沒有誕生之前,c++只能這么寫,很折磨人。
如果用boost::lambda的話,這個問題就可以寫成:
map<int, int> testMap;
testMap[1] = 3;
testMap[2] = 3;
testMap[4] = 3;
testMap[6] = 3;
int nCount = count_if(testMap.begin(), testMap.end(), bind(&pair<const int, int>::first, _1) < 5); // nCount == 3.
如果用boost::lambda的話,這個問題就可以寫成:
map<int, int> testMap;
testMap[1] = 3;
testMap[2] = 3;
testMap[4] = 3;
testMap[6] = 3;
int nCount = count_if(testMap.begin(), testMap.end(), bind(&pair<const int, int>::first, _1) < 5); // nCount == 3.
re: 封裝固定長度字符數組的模板容器類 尹東斐 2009-05-02 22:58
我覺得這個可以考慮重新定義一個
template <class T, int N>
class my_allocator
: public allocator<T>
{
//按照N分配空間
};
template <int N>
class my_string
: public basic_string<char, char_traits<char>, my_allocator<char, N> >
{};
這樣子實現起來,不用考慮異常安全等問題,標準庫會考慮這個,因為allocator的實現比起string來,簡單多了。
template <class T, int N>
class my_allocator
: public allocator<T>
{
//按照N分配空間
};
template <int N>
class my_string
: public basic_string<char, char_traits<char>, my_allocator<char, N> >
{};
這樣子實現起來,不用考慮異常安全等問題,標準庫會考慮這個,因為allocator的實現比起string來,簡單多了。
re: boost::shared_ptr 的 cast 尹東斐 2009-05-01 23:25
@陳梓瀚(vczh)
嗯,謝謝提醒,我理解有問題。
嗯,謝謝提醒,我理解有問題。
re: std::endl 是什么? 尹東斐 2009-04-18 21:08
@OwnWaterloo
嗯,就是這樣子的。
其實可以直接從basic_ostream繼承,然后把stream_buf改成自己想要的輸出方式就可以。
嗯,就是這樣子的。
其實可以直接從basic_ostream繼承,然后把stream_buf改成自己想要的輸出方式就可以。
re: JIT腳本引擎:完成20個浮點函數 尹東斐 2009-04-16 22:08
都不知道FPU還能直接算sin,cos,太牛了。
re: 為什么typedef的類型按照基類的聲明順序起作用? 尹東斐 2009-04-10 13:35
@Sandy
對的,我犯錯誤了。 public要放前面。
像Sunshine Alike的編譯器報的錯就有點奇怪,private指的是access不可見的。
對的,我犯錯誤了。 public要放前面。
像Sunshine Alike的編譯器報的錯就有點奇怪,private指的是access不可見的。
re: 為什么typedef的類型按照基類的聲明順序起作用? 尹東斐 2009-04-10 13:33
@Sunshine Alike
不好意思,public 應該放前面。
codeblocks 的編譯錯誤有點奇怪的說,因為private的東西對子類來說是可見的,就是是private的,也不至于'base' has not been declared,很奇怪。
不好意思,public 應該放前面。
codeblocks 的編譯錯誤有點奇怪的說,因為private的東西對子類來說是可見的,就是是private的,也不至于'base' has not been declared,很奇怪。
re: 為什么typedef的類型按照基類的聲明順序起作用? 尹東斐 2009-04-10 13:31
@路人丁
我嘗試兩個編譯器VS2005 & VS2008,不知道你的編譯器怎么樣?
我嘗試兩個編譯器VS2005 & VS2008,不知道你的編譯器怎么樣?
re: 搞定模板元編程(meta programming) 尹東斐 2009-04-09 23:58
很贊。
我自從看了 C++ Templates are Turing Complete 以后,覺得很汗~
這些大牛們都已經在理論上證明c++ template是圖靈機等價的,也就是說可以在編譯器做任何想做的事,就對研究模板失去了興趣。
感嘆,模板的技法實在太少了,這么長的代碼,大部分都在重復,真期待0x趕緊到來,可以在模板中使用 <...> .
多交流吧。
我自從看了 C++ Templates are Turing Complete 以后,覺得很汗~
這些大牛們都已經在理論上證明c++ template是圖靈機等價的,也就是說可以在編譯器做任何想做的事,就對研究模板失去了興趣。
感嘆,模板的技法實在太少了,這么長的代碼,大部分都在重復,真期待0x趕緊到來,可以在模板中使用 <...> .
多交流吧。
re: Pascal簡化版 尹東斐 2009-04-09 23:44
不錯,如果結構設計的好的話,擴展可支持的類型,添加新的功能是很容易的。
如果你有scope的概念的話,增加函數功能也很容易。
加油。
如果你有scope的概念的話,增加函數功能也很容易。
加油。
re: static 變量初始化順序的問題和解決方案。 尹東斐 2009-03-20 14:55
@陳梓瀚(vczh)
很精辟,贊。
很精辟,贊。
re: 深入探索 boost::lambda 系列(四) 尹東斐 2009-03-19 18:39
@蔡芳鈞
@wulin
歡迎來頂 : )
@wulin
歡迎來頂 : )
re: boost::trait::is_reference 的研究與修改 尹東斐 2009-02-21 10:35
@jans2002
模板現在是不好調試,不過好像VC 10的 intellisence 會有幫助吧。 還沒有用過。
我目前的水平主要還是自己推,不知道大牛們玩模板是不是和咱寫程序一樣輕松。。。
模板現在是不好調試,不過好像VC 10的 intellisence 會有幫助吧。 還沒有用過。
我目前的水平主要還是自己推,不知道大牛們玩模板是不是和咱寫程序一樣輕松。。。
re: boost::any 為什么要用 static_cast 呢? 尹東斐 2009-02-20 22:36
@ebenzhang
boost::any的實現中,用type_info配合static來做類型檢查。
所以我說他用RTTI。
我意思是不想通過使用 typeid 獲得 type_info,從而檢查類型。
我沒有說清楚,謝謝提醒。
boost::any的實現中,用type_info配合static來做類型檢查。
所以我說他用RTTI。
我意思是不想通過使用 typeid 獲得 type_info,從而檢查類型。
我沒有說清楚,謝謝提醒。
re: boost::any 為什么要用 static_cast 呢? 尹東斐 2009-02-20 17:33
@lwan
這里還是要動靜結合的,所有cast都是運行期做的事情。在編譯期,能用的運算型關鍵字少得可憐,像 sizeof 這種。所以有必要的時候,可以借助運行期的特性。
靜態還是為動態服務的,不必在他們之間畫出一條道來,從此不往來。只要能盡可能的解決問題,并優雅,高效就是王道。
這里還是要動靜結合的,所有cast都是運行期做的事情。在編譯期,能用的運算型關鍵字少得可憐,像 sizeof 這種。所以有必要的時候,可以借助運行期的特性。
靜態還是為動態服務的,不必在他們之間畫出一條道來,從此不往來。只要能盡可能的解決問題,并優雅,高效就是王道。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
常用鏈接
留言簿(4)
隨筆檔案
文章分類
文章檔案
相冊
好友博客
- CUCmehp
- λ-calculus
- 編譯器狂人
搜索
最新評論

- 1.?re: next_permutation, next, next, next...
-
恩是的 呵呵@leaf
- --一夢
- 2.?re: next_permutation, next, next, next...
- 很好,很強大!
- --一夢
- 3.?re: 深入探索 boost::lambda 系列(二)
- 為什么op類的模板參數和operator()的模板參數需要兩個呢?為什么op::operator()也需要十個模板函數呢?
- --匿名
- 4.?re: 自動求導模板庫
- 謝謝樓主 順便鄙視下樓上 不懂禮貌
- --謝謝
- 5.?re: doodle jump's score[未登錄]
- 我能打到10w+
- --wonder