블로그 게시물 Automatic Memoization in c++0x은 기존 기능의 메모 버전을 생성하는 기능을 제공합니다. 블로그 포스트 및 관련 코드는 이전에 stackoverflow (예 : What does this C++11 code do?)에서 논의되었지만, 이러한 솔루션 중 어느 것도 재귀 함수를 올바르게 메모 할 수있는 완전히 보편적 인 메모를 제공 할 수 없습니다.재귀 함수를 지원하는 자동 메모
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));
}
그러나 :
물론, 이런 식으로 뭔가를 사용하여 재귀 호출을 변경하는 트릭이있다 (우리는 이미 자리에 memoize
라는 블로그 게시물에서 제시 한 바와 같이 memoizer이 가정) 이것은 우리가 기억하고 싶은 기능에 대한 접근이 여전히 필요하기 때문에 적절한 해결책보다 일시적인 해결책이라고 생각합니다. 적절한 솔루션은 일부 라이브러리에 정의 된 기능을 포함하여 모든 기능을 완전히 메모 할 수 있어야합니다. 그러나 그러한 솔루션을 만드는 것은 가능하기 때문에 내 도달 범위를 넘어선 것입니다. 따라서 다음과 같이 묻습니다.
진정한 보편적 인 메모 기능이 가능합니까?
은 어떻게 그러한 위업을 달성 할 수 있습니까?
그리고 이것이 가능하지 않은 경우 위의 방법을 일반화하는 방법이 적어도 있습니다. (컴파일되지 유효한 C는지지 않습니다 ++)의 라인을 따라 뭔가 : this_func
클래스의 this
포인터하지만 기능과 유사 뭔가
int fib(int n){
if (n < 2) return n;
return this_func(n-1) + this_func(n-2);
}
. [편집 :이 아마 여전히 문제로 고통 것 this_func
포인터가 대신 fib
를 가리키는 것 memoized fib
]
저는 미리 컴파일 된 라이브러리를 사용하여이를 수행 할 방법이 없다고 생각합니다. memoized_fib() 래퍼 함수로 fib()의 재배치를 대체하기 위해 링커를 사용하는 것이 사실 인 후에 memoization을 추가하는 방법에 대한 내 첫 번째 추측. 그러나 컴파일 및 링크 단계의 세부 사항을 알지 못하기 때문에 내부 순환이 대체를 위해 링크 단계에서 사용할 수 있는지 여부를 알 수 없습니다. 아, 그리고 나는 그런 종류의 대체를 할 링커를 모른다. – Speed8ump
재귀 호출이 동일한 캐시를 사용하도록하려면 캐시간에 캐시를 공유해야한다고 생각합니다. 즉,'정적'(더 좋지만 더 느린 :'thread_local') 캐시를 사용하거나 캐시를 추가 인수로 전달하십시오. 어쨌든'fib '의 수정이 필요합니다. 함수의 메모 버전을 통해 캐시를 인수로 전달하는 후자의 기술을 사용하는 [wikipedia의 예제] (https://en.wikipedia.org/wiki/Fixed_point_combinator#Explanation_for_imperative_programmers)가 있습니다. – dyp