2010-07-27 4 views

답변

0

정말 아니다 (AFAIK)이 수행하는 컴파일러하지만, 플러그인 ReSharper에서를 사용하는 경우 Visual Studio에서 C 번호를 작성할 때, 당신은 const로 뭔가를 선언 할 수 있음을 나타냅니다 시간 힌트를 컴파일 할 수 있습니다. 반면에, 그것은 "당신에게 그렇게 말하지 않는"범주에 속하지 않으므로, 당신이 찾고있는 것이 아닐 수도 있습니다. ...

+0

물론 컴파일러가 다른 외부 도구를 사용하지 않고 자동으로 감지 할 수 있기를 바랍니다. – Eduardo

2

이렇게하려면 포인터가있는 언어에서 본질적으로 위험합니다. 글로벌 컴파일이 부족하다 & 분석. 따라서 연산이 비 const로 선언되면 컴파일러는 부작용이있을 수 있다고 가정해야합니다.

예 : GetYGetX 포인터 및 역 참조로 인수를 취급 및 비 - 작용, 부작용이 발생하기 쉬운 방식으로 데이터를 수정하는 것을 말할 수 컴파일 동안

//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); 
} 

컴파일러. 이 정보는 링크 중에 만 사용할 수 있으므로 이러한 기능을 지원하기 위해 많은 코드 생성 및 분석을 포함하도록 링크 개념을 다시 만들어야합니다.

+0

물론 GetX가 순수한 수학 함수가 아니라면 GetX는 순수하지 않은 수학 함수를 호출하므로 (아마 우리는 그 함수를 호출해야합니다). 함수가 외부 함수를 호출하는 경우 순수 수학이 아닌 것으로 가정해야합니다. – Eduardo

+0

하지만 문제는 "외부"란 다른 번역 단위 (다른 .c 파일)를 의미합니다. 그것은 큰 한계입니다. –

+0

GCC의 "-flto"옵션은 연결 단계에서 최적화를 수행합니다. –

0

다음 코드에서 "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 명령 줄 옵션이 있습니다.

관련 문제