나는 이것을 GCC is not able to detect pure mathematical functions and it needs you to provide the attribute "const" to indicate that으로 보았습니다.순수 수학 기능을 탐지하고 최적화 할 수있는 컴파일러는 무엇입니까?
순수 수학 함수를 감지하고 최적화 할 수있는 컴파일러는 무엇입니까?
나는 이것을 GCC is not able to detect pure mathematical functions and it needs you to provide the attribute "const" to indicate that으로 보았습니다.순수 수학 기능을 탐지하고 최적화 할 수있는 컴파일러는 무엇입니까?
순수 수학 함수를 감지하고 최적화 할 수있는 컴파일러는 무엇입니까?
정말 아니다 (AFAIK)이 수행하는 컴파일러하지만, 플러그인 ReSharper에서를 사용하는 경우 Visual Studio에서 C 번호를 작성할 때, 당신은 const
로 뭔가를 선언 할 수 있음을 나타냅니다 시간 힌트를 컴파일 할 수 있습니다. 반면에, 그것은 "당신에게 그렇게 말하지 않는"범주에 속하지 않으므로, 당신이 찾고있는 것이 아닐 수도 있습니다. ...
이렇게하려면 포인터가있는 언어에서 본질적으로 위험합니다. 글로벌 컴파일이 부족하다 & 분석. 따라서 연산이 비 const로 선언되면 컴파일러는 부작용이있을 수 있다고 가정해야합니다.
예 : GetY
는 GetX
포인터 및 역 참조로 인수를 취급 및 비 - 작용, 부작용이 발생하기 쉬운 방식으로 데이터를 수정하는 것을 말할 수 컴파일 동안
//getx.cpp
int GetX(int input)
{
int* pData = (int*) input;
*pData = 50;
return 0;
}
// gety.cpp
int GetY(int input)
{
return GetX(input + 4);
}
// main.cpp
int main()
{
int arg[] { 0, 4 };
return GetY((int)arg);
}
컴파일러. 이 정보는 링크 중에 만 사용할 수 있으므로 이러한 기능을 지원하기 위해 많은 코드 생성 및 분석을 포함하도록 링크 개념을 다시 만들어야합니다.
물론 GetX가 순수한 수학 함수가 아니라면 GetX는 순수하지 않은 수학 함수를 호출하므로 (아마 우리는 그 함수를 호출해야합니다). 함수가 외부 함수를 호출하는 경우 순수 수학이 아닌 것으로 가정해야합니다. – Eduardo
하지만 문제는 "외부"란 다른 번역 단위 (다른 .c 파일)를 의미합니다. 그것은 큰 한계입니다. –
GCC의 "-flto"옵션은 연결 단계에서 최적화를 수행합니다. –
다음 코드에서 "gcc -O2 -S"를 실행하고 어셈블리를 읽으면 test() 내에서 foo() 호출이 순수한 것으로 식별되어 루프 외부로 이동했습니다. :
#include <stdio.h>
double __attribute__((noinline)) foo(double x)
{
x = x + 1;
x = x * x;
if (x > 20)
x -= 1;
x -= x * x;
return x;
}
void test(int iters, double x)
{
int i;
for (i = 0; i < iters; ++i) {
printf("%g\n", foo(x));
}
}
이것은 Fedora 22, gcc 5.1.1, x86_64입니다. 나는 시도하지는 않았지만, -flto를 사용하면 컴파일 유닛에서 작동 할 것으로 기대됩니다.
또한 gcc에는 -Wsuggest-attribute = pure 및 -Wsuggest-attribute = const 명령 줄 옵션이 있습니다.
물론 컴파일러가 다른 외부 도구를 사용하지 않고 자동으로 감지 할 수 있기를 바랍니다. – Eduardo