博客文章Automatic Memoization in c++0x提供了生成現有功能的記憶版本的功能。博客文章和相關代碼之前已經在stackoverflow(例如What does this C++11 code do?)中討論過,但是,這些解決方案都不能提供能夠正確記憶遞歸函數的完全通用記憶器。支持遞歸功能的自動記憶功能
當然,也有改變,通過使用像這樣的遞歸調用的伎倆(假設我們有一個memoizer比如在博客中提出的一個已經在地方叫memoize
):
std::function<int (int)> f;
int fib(int n) {
if (n < 2) return n;
return f(n-1) + f(n-2);
}
int main(void) {
f = memoize(std::function<int (int)>(fib));
}
但這種感覺更像是一種解決方法,而不是一個合適的解決方案,因爲我們仍然需要訪問我們想要記憶的功能。一個合適的解決方案應該能夠完全記憶任何功能,包括某些庫中定義的功能。然而,生產這樣的解決方案似乎超出了我的範圍(假設它是可能的),因此我在問:
是否可以實現真正的通用記憶功能?
如何可以實現這樣的壯舉?
如果這是不可能的,是否至少有一種方法來推廣上述方法。沿(不編譯和無效C++)線的東西:
int fib(int n){
if (n < 2) return n;
return this_func(n-1) + this_func(n-2);
}
哪裏this_func
是一些東西,類似於this
指針一類的,但對於一個功能。 [編輯:這可能仍然從問題的困擾,該this_func
指針將指向fib
代替memoized fib
]
我不認爲今天有什麼辦法做到這一點,特別是預編譯的庫。我的第一個猜測是,在事實之後添加記憶的方法是使用鏈接器用memoized_fib()包裝函數替換fib()的重定位。然而,我不知道編譯和鏈接階段的細節,以瞭解內部遞歸在鏈接階段是否可用於替換。哦,我不知道有一個鏈接器可以做這種替換。 – Speed8ump
如果您希望遞歸調用使用相同的緩存,我認爲您需要以某種方式在它們之間共享緩存。也就是說,要麼使用'static'(更好,但更慢:'thread_local')緩存或將緩存作爲附加參數傳遞。無論哪種方式都需要修改'fib'。 ([wikipedia]上的一個例子](https://en.wikipedia.org/wiki/Fixed_point_combinator#Explanation_for_imperative_programmers),它使用後一種技術,通過函數的memoized版本將緩存作爲參數傳遞。) – dyp