@Bill Gates
我之前提到這個Hans_Boehm GC, 它由于是Conservative Garbage Collector,所以沒有辦法證明其絕對安全。
他的算法通過指針的地址判斷指針是否在堆上,重載全局new以后,他控制了所有內(nèi)存分配,他知道堆上最小的地址和最大的地址,然后通過判斷指針的地址是否落在在個區(qū)域內(nèi)部來判斷這個指針在堆上還是棧上。
這種方法沒辦法實現(xiàn)內(nèi)存緊縮的功能。
還有,在工程中,用到其他庫的的時候都會考慮包裝,一般不會直接使用,加一個間接層,即使它的內(nèi)存不完全由你控制,但是你還是可以部分控制的。
re: 自動求導模板庫 尹東斐 2009-12-07 11:10
下載的文件放在和其他程序文件相同的目錄下,然后#include“ad.h”
要不你可以放在其他文件下,然后#include “xxx/ad.h"
具體用法參見前面的example。
re: 最長運行時間(百度筆試題) 尹東斐 2009-10-15 11:12
@wulin
不需要考慮存儲程序的空間,因為數(shù)據(jù)和程序在內(nèi)存中完全沒有區(qū)別。所以從某種角度來看,程序也是數(shù)據(jù)的一種。
比如:
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;
現(xiàn)在我要通過類似 int x = func(a, "i"); 來的到a中i的值,那這個時候,怎么知道i的類型呢?也就是說func的返回值是從哪里來的?
不吝賜教~
@陳梓瀚(vczh)
>>VL_ADD_CLASS_MEMBER(Weight)可以得到Weight的類型,這個用模板就可以了。
這個用模板也做不到吧? 除非有typeof之類的操作符,否則拿不到類型的呀。
這實現(xiàn)看起來很有誘惑力 :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的時候,沒有涉及到成員的類型,那么當讀取數(shù)據(jù)的時候,類型是怎么得到的?
GetConsole()->WriteLine(Converter.FindToStringConverter(Inspector)->ConvertToString(Inspector,Type.Object()));
你在這里用到了Type.Object(),我想問你是不是把所有類型都包裝起來了,相當于每個類型都有個get_type()之類的方法,如果你是這么實現(xiàn)的,那就沒有問題了。如果不是的話,
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"是你為所有“內(nèi)建”類型寫的。
難道Inspector里面包含有每個成員的類型?
re: 類實例能做做模板參數(shù)嗎? 尹東斐 2009-06-04 23:52
@hdqqq
嗯,謝謝,領教了。
re: 類實例能做做模板參數(shù)嗎? 尹東斐 2009-06-02 20:20
@hdqqq
樓上eXile說了,這個類型是叫函數(shù)類型的,但是它不能被實例化。也就是你的type_func。
@飄飄白云
我只是覺得這個rvalue reference是最重要的特性,可以不知不覺的增加效率,所以就決定寫點什么。
恩,你全文翻譯了,敬佩中,這三篇雖然看了,我覺得rvalue reference比較有意思。
當然樓上說這些特性微不足道,是因為他還沒到能看出來這些特性強大之處的境界~~
不過不知道為啥vc10不支持conception,這個鄙人認為是最強大的特性之一了,有了這個,就可以和那種上百KB的error message說再見了。
re: 類實例能做做模板參數(shù)嗎? 尹東斐 2009-05-27 14:04
@hdqqq
在模板的位置上,它的確是個類型,但是我不知道你想說明什么?
整篇文章,我都在嘗試說明在模板參數(shù)的位置上,std::string()只是個標記,純粹用作類型推導,只是這種寫法很容易會誤導人讓人認為那是個構造函數(shù)。而這個誤導源自于 return type deduction,因為在新的C++0x中,可能會有
int Test()
{
return 3;
}
type(Test()) i = 8;
如果這個被實現(xiàn)的話(vs2010已經(jīng)有auto了,我想這個應該不遠了).編譯器可以做返回類型推導,那么在模板參數(shù)的位置上,寫函數(shù)調(diào)用也就不足為奇了。
所以,這篇文章主要想說明,到目前為止,函數(shù)返回類型是推導不出來,而類似std::string()的寫法只是個折中方案而已。
當然不是構造函數(shù)調(diào)用。
re: 類實例能做做模板參數(shù)嗎? 尹東斐 2009-05-25 19:08
@hyrish
你說的那種是函數(shù)模板,函數(shù)模板的模板參數(shù)可以靠編譯器自動推導,以類型明確的變量為基礎。而在類模板中,只能事先聲明,然后使用,編譯器無法推導。
這個解法很好,在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.
我覺得這個可以考慮重新定義一個
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> >
{};
這樣子實現(xiàn)起來,不用考慮異常安全等問題,標準庫會考慮這個,因為allocator的實現(xiàn)比起string來,簡單多了。
@陳梓瀚(vczh)
嗯,謝謝提醒,我理解有問題。
re: std::endl 是什么? 尹東斐 2009-04-18 21:08
@OwnWaterloo
嗯,就是這樣子的。
其實可以直接從basic_ostream繼承,然后把stream_buf改成自己想要的輸出方式就可以。
@Sandy
對的,我犯錯誤了。 public要放前面。
像Sunshine Alike的編譯器報的錯就有點奇怪,private指的是access不可見的。
@Sunshine Alike
不好意思,public 應該放前面。
codeblocks 的編譯錯誤有點奇怪的說,因為private的東西對子類來說是可見的,就是是private的,也不至于'base' has not been declared,很奇怪。
@路人丁
我嘗試兩個編譯器VS2005 & VS2008,不知道你的編譯器怎么樣?
很贊。
我自從看了 C++ Templates are Turing Complete 以后,覺得很汗~
這些大牛們都已經(jīng)在理論上證明c++ template是圖靈機等價的,也就是說可以在編譯器做任何想做的事,就對研究模板失去了興趣。
感嘆,模板的技法實在太少了,這么長的代碼,大部分都在重復,真期待0x趕緊到來,可以在模板中使用 <...> .
多交流吧。
re: Pascal簡化版 尹東斐 2009-04-09 23:44
不錯,如果結構設計的好的話,擴展可支持的類型,添加新的功能是很容易的。
如果你有scope的概念的話,增加函數(shù)功能也很容易。
加油。
@jans2002
模板現(xiàn)在是不好調(diào)試,不過好像VC 10的 intellisence 會有幫助吧。 還沒有用過。
我目前的水平主要還是自己推,不知道大牛們玩模板是不是和咱寫程序一樣輕松。。。
@ebenzhang
boost::any的實現(xiàn)中,用type_info配合static來做類型檢查。
所以我說他用RTTI。
我意思是不想通過使用 typeid 獲得 type_info,從而檢查類型。
我沒有說清楚,謝謝提醒。
@lwan
這里還是要動靜結合的,所有cast都是運行期做的事情。在編譯期,能用的運算型關鍵字少得可憐,像 sizeof 這種。所以有必要的時候,可以借助運行期的特性。
靜態(tài)還是為動態(tài)服務的,不必在他們之間畫出一條道來,從此不往來。只要能盡可能的解決問題,并優(yōu)雅,高效就是王道。