2009-04-05 3 views
1

많은 비용이 소요되는 함수 하나가 여러 번 호출되며 매개 변수에 사용할 수있는 값의 집합이 매우 제한되어 있습니다.
함수 반환 코드는 인수에만 의존하므로 가능한 인수 및 해당 반환 코드에 대해 함수 내에 정적 캐시를 유지하는 것이 가장 쉽습니다. 따라서 매개 변수의 모든 조합에 대해 값 비싼 연산은 한 번만 수행됩니다 .
나는 항상 이런 상황에서이 방법을 사용하고 있지만 잘 작동하지만 GCC 함수 속성이 const 또는 pure 일 때이 문제를 해결할 수 있다고 생각됩니다.GCC 함수 속성 대 캐싱

아무도이 경험이 있습니까? GCC가 pureconst 속성을 사용하는 방법 - 컴파일 타임이나 런타임에만?
나는, 함수를 호출 할만큼 현명하게 GCC에 의존 동일한 매개 변수 값을 한 번만

int foo(int) __attribute__ ((pure)) 

로 선언 또는 보장은 전혀 없다 내가 더 나은 캐싱 방식에 충실 할 수 있습니까?

EDIT : 제 질문은 캐싱/메모/룩업 테이블에 관한 것이 아니라 GCC 함수에 대한 것입니다.

+0

순수하지 않습니다. 그러나 const는 좋아 보인다. –

답변

15

나는 GCC 순수 속성을 memoization과 혼동하고 있다고 생각합니다.

GCC pure 특성을 사용하면 컴파일러에서 특정 상황 (루프 언 롤링 등)에서 함수가 호출되는 횟수를 줄일 수 있습니다. 그러나 그것이 적절하다고 생각하는 경우에만 그렇게 할 것이라는 보장은 없습니다.

찾고있는 것으로 보이는 것은 기능을 메모하는 것입니다. Memoization은 동일한 입력에 대한 계산을 반복해서는 안되는 최적화입니다. 대신 이전 결과가 반환되어야합니다. GCC pure 속성은 이런 식으로 함수를 작동시키지 않습니다. 이것을 구현해야합니다.

+0

좋아, 나는 기억하지 않았다 - 암기, 나는 그것을 캐싱이라고 불렀다. 그리고 그것은 내가 구현 한 것이다. 나는 다른 방법이 있기를 바랐다. – qrdl

+0

@ qrdl, memoization은 매우 특정한 형태의 캐싱입니다. 가능한 경우 전문 용어를 사용하지 마십시오. 대화에 항상 가치를 부여한다고 생각하지 않기 때문입니다. 이 경우에 단어를 아는 것은 많은 memoization 라이브러리와 기사가 있기 때문에 가치를 더합니다. 재미있는 주제입니다. – JaredPar

+0

다음에는 기억 코드를 처음부터 쓰지 않고 라이브러리를 확인해 주셔서 감사합니다. – qrdl

2

필자는 여러 번 호출되는 값 비싼 함수가 하나 있는데 매개 변수에 사용할 수있는 값의 집합이 매우 제한되어 있습니다.

왜 정적 상수 맵을 사용하지 않을까요? (인수는 키를 생성하기 위해 해시 될 수 있으며, 리턴 코드는 값입니까?

+0

반환 값은 프로그램 실행 중에 변경되지 않지만 실행간에 변경 될 수 있으므로 모든 가능한 매개 변수 값에 대해 적어도 한 번 이상 함수를 호출해야하는 데이터베이스에 따라 다릅니다. – qrdl

+0

흠. 한번의 실행으로 데이터가 변경되지 않는 한지도를 만들 수 있습니다. 조회 테이블은 항상 감미롭습니다. – dirkgently

+0

그것이 내가하는 일이고 내가 캐싱이라고 부르는 것입니다. JaredPar는 암기라고 말했습니다. – qrdl

1

이것은 템플릿 기능으로 해결 될 수있는 것처럼 들립니다. 알려진 매개 변수와 반환 값이 컴파일 타임에 알려지면 모두 가능한 매개 변수 각각에 대해 함수의 템플릿 인스턴스를 생성 할 수 있습니다. 본질적으로 가능한 각 매개 변수에 대해 함수의 다른 인스턴스를 호출하게됩니다. 이미 구현 한 정적 캐시보다 더 쉬울 지 모르지만 탐구할만한 가치가있을 수 있습니다.

체크 아웃 template metaprogramming. 이 개념은 JaredPar가 제안한 '메모 (memoization)'와 유사하며 계승 함수의 동일한 소개 예제를 사용하는 경우에도 마찬가지입니다. 이러한 종류의 템플릿은 컴파일시에 메모를 구현하는 것이라고 말할 수 있습니다.

+0

컴파일 타임에 매개 변수와 반환 값을 알 수 없습니다. 하지만 템플릿 기능을 자세히 설명해 주시겠습니까? 나는이 접근법에 대해 들어 본 적이 없다. – qrdl

+0

위 참조를 추가했습니다. 나는 당신의 문제에 적합한 예를 쓸 충분한 실제 경험이 없습니다. 현재의 문제에는 유용하지 않을 수도 있지만, C++ 템플릿 엔진으로 할 수있는 것을 탐색하는 것은 확실히 흥미 롭습니다. – veefu

+0

방금 ​​C 언어로만 작업 할 수 있다는 것을 깨달았습니다. 이 경우 산만에 대해 사과드립니다. – veefu

1

나는 오래된 스레드를 다시 좋아 해달라고하지만, 특히 공격적인 코멘트는 여기에 있었다 :

"템플릿 오히려 같은 유형의 다른 값보다, 다른 유형을 다루는된다"이제

취할 간단한 템플릿 계승 구현 :

template<int n> struct Factorial { 
    static const int value = n * Factorial<n-1>::value; 
}; 

template<> struct Factorial<0> { 
    static const int value = 1; 
}; 

여기서 템플릿 매개 변수는 typename이 아닌 정수입니다.