2013-04-09 3 views
1

매개 변수로 참조 또는 포인터를 사용하지 않는 함수가있는 경우 반환 유형은 사용되지 않고 관찰 할 수있는 호출을하지 않습니다 (I/O 호출, 시스템 시간 변경 , 등), 그것이 정의 된 클래스 만 수정하면됩니까? 나는이 규칙에 생각할 수컴파일러 또는 정의 된 동작에 대한 가능한 최적화

유일한 예외는 뭔가를 않습니다 :

void a(int b, int c){ 
    *((int*)b) = c; } 

int main() { 
    int d=1; 
    a((int)(&d),d+1); 
    return 0; } 

는 보장이

을 정의하는 것입니다? 나는 int*int이 같은 크기 일 필요는 없다는 것을 알고 있지만, 같은 크기로 정의 되었다면, 이것이 작동해야합니까, 아니면 여전히 정의되지 않은 동작입니까?

목표는 기능을 법적으로 최적화 할 수 있는지 확인하는 것입니다 (즉, 부작용이 없다는 것을 입증 할 수 있다면 제거 할 수 있음).

+2

참조 : [위키 백과의 죽은 코드 제거] (http://en.wikipedia.org/wiki/Dead_code_elimination) 및 [그래서 죽은 코드] (http://stackoverflow.com/questions/4813947/how-can-i) 코드에서 절대 사용되지 않는 부분). –

+0

@artlessnoise 이것은 http://stackoverflow.com/questions/15825188/removing-useless-lines-from-c-file과 같은 것입니다. 또한, 이것은 데드 코드가 아니며, 이것은 아무것도 수행하지 않는 라이브 코드입니다. – soandos

+0

아니, 제 생각에는 (내가 틀렸다면 수정하십시오) 당신은 그것을 최적화 할 수 없습니다. b 및 c가 영향을받을 수있는 공유 포인터가있는 클래스의 인스턴스라고 생각하십시오. 범위를 벗어날 때 발생하는 소멸자의 요청에 대해서도 생각해보십시오. – rralf

답변

1

표준 보증과 : 그들은 또한 그것이 작동하는 방법의 좋은, 간단한 예제를 가지고 원래 포인터 유형은 동일한 포인터 값을 생성하도록 보장됩니다.

int *p = new int(5); 
intptr_t i = reinterpret_cast<intptr_t>(p); 
// ... 
int *q = reinterpret_cast<int*>(i); 

assert(p == q); 
*q = 10; 
assert(*p == 5); 

컴파일러는 부작용이없는 코드를 제거 할 수있다, 그러나 그것은 명확하게 기능 만 서명을 검사하여 확인할 수 없습니다 : 그래서 그래,이 보장됩니다. 컴파일러에서 코드를 볼 수있는 인라인 함수의 경우 컴파일러가 성공할 수 있습니다. 다른 번역 단위로 정의 된 함수의 경우 조금 더 어렵습니다 (함수가 일 경우 링크 시간 최적화 기능을 사용하여 실행 가능합니다).

이는 값 또는 const- 참조로 인수를 취하는 함수에만 국한되지 않음에 유의하십시오. 컴파일러가 이 이라는 인수를 으로 수정하면이라는 함수가 수정 된 것으로 보이지만 수정 된 개체의 값이 다시 읽히지 않는다는 것을 증명할 수는 있지만 이론적으로 호출을 제거 할 수 있습니다. 다른 한편으로는, 나는 단순한 경우를 제외하고는 컴파일러에서이 일을하지 않을 것입니다.

0

"잘 정의되지 않은 정의되지 않은 동작"에 해당합니다. 아마 (sizeof (int *) == sizeof (int)로 가정), 기술적으로 정의되지 않았으며, 일부 컴파일러가 장래에 그것을 완전히 깨뜨릴 수있는 실제적인 기회가 있습니다. 이것의 또 다른 예는 유니온을 사용하여 부동 소수점을 int로 다시 해석하는 것입니다.

또한 LLVM의 링크 시간 최적화의 방향을 알려주지 않으면 완전히 어긋납니다. 그것은 당신이 링크 시간에 대해 이야기하고있는 것을 정확히하는 것을 목표로합니다. 그것은 최고이고 osx의 'out of the box'에서 작동합니다. 받는 사람 다시 reinterpret_cast는 (모든 값을 보관 유지하는데 충분한 크기)을 적합한 통합 유형에 대한 포인터로 변환하는 데 사용 http://llvm.org/docs/LinkTimeOptimization.html