순수은 함수가 전역 메모리를 수정하지 않는다는 함수 속성입니다.
const은 함수가 전역 메모리를 읽거나 수정하지 않는다는 함수 특성입니다.다른 컴파일러의 순수/const 함수 특성
이 정보가 주어지면 컴파일러는 몇 가지 추가 최적화를 수행 할 수 있습니다. GCC에 대한
예 :
그 예에서float sigmoid(float x) __attribute__ ((const));
float calculate(float x, unsigned int C) {
float sum = 0;
for(unsigned int i = 0; i < C; ++i)
sum += sigmoid(x);
return sum;
}
float sigmoid(float x) { return 1.0f/(1.0f - exp(-x)); }
, 컴파일러 최적화 할 수있는 기능 계산에 :
float calculate(float x, unsigned int C) {
float sum = 0;
float temp = C ? sigmoid(x) : 0.0f;
for(unsigned int i = 0; i < C; ++i)
sum += temp;
return sum;
}
또는 컴파일러가 충분히 영리 (약 그렇게 엄격하지 않은 경우 수레) :
float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }
GCC, Clang, ICC, MSVC 또는 다른 컴파일러와 같은 다른 컴파일러의 경우 이러한 방식으로 사용합니까?
gcc를 정기적으로 사용하지 않는 사용자의 경우 pure/const 속성에 대한 설명을 게시 할 수 있습니다. 일종의 최적화라면 컴파일러가보다 최적의 어셈블리를 생성하는 데 도움이되는 C 또는 C++ 코드의 예가 유용 할 것입니다. –
필자는 컴파일러 작성자가 아니지만 동일한 번역 단위에서'sigmoid()'함수 정의가 컴파일러 *에서 * calculate() 전에 사용 가능하다면 그러한 속성은 불필요하다고 생각합니다. 그럼에도 불구하고이 속성은 함수 정의가 다른 번역 단위에있을 때 확실히 유용 할 수 있습니다. – Void
예, GCC (및 다른 컴파일러)는이 경우에이 속성을 내부적으로 자동으로 추가합니다. 그런 다음 속성을 기반으로 추가 최적화 작업을 수행 할 수 있습니다 (예와 같이). 컴파일러가 그 시점에서 정의를 보지 못하거나 정의가 사용 가능하지 않거나 컴파일러가 컴파일러의 양을 줄이면 안전하다고 생각하는 경우 함수 호출. – Albert