0

저는 우분투 12.04 및 g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5)에서 C++로 프로그래밍하고 있습니다. 4.6.3.템플릿 길이로 배열에 액세스 할 때 Bogus "배열 첨자가 배열 경계 위에 있습니다"경고

은 내가 템플릿 벡터 클래스 유형 typelength 구성 요소가

template <typename type, int length> 
class Vector { 
    // Implementation 
}; 

에게 있습니다.

는 또한 템플릿되는 다른 클래스에서이 클래스를 사용합니다. 이 클래스는 해당 벡터에 사용할 요소 수를 템플릿 인수로 사용합니다 (dim).

이 인수는 중 2 또는 내가 dim == 3 경우, 특별한 일을해야 할 3, 그래서 더 많거나 적은 종종이 같은 것들을 썼다 :

if (dim == 3) { 
    // do special things here 
} 

생각, 클래스가 매개 변수로 호출 2, 컴파일러는 조건이 참 결코 것을 볼 수 있으며 그 반대의 변환되지 않습니다 매개 변수가 3 인 경우, 컴파일러는 조건이 결코 거짓 것을 볼 수 있습니다 모든 것을 번역하고 if을 최적화합니다. -O0로 컴파일 할 때

나는 더 경고를 얻을 수 없지만, -O3에 전환 할 때 나는 pr 매개 변수로 주어진 유형이며,이 중 하나

Vector<pr, dim> v; 
v[0] = ... 
v[1] = ... 
if (dim == 3) v[2] = ... 

같은 라인에 경고 array subscript is above array bounds 포인팅을 얻을.

나는 왜 경고를 얻는 지 이해할 수 없다 : 왜냐하면 dim == 2이면 할당이 실행되지 않고 3이면 할당이 문제를 일으키지 않기 때문이다.

필자는 항상 생각했다. 템플릿 작업은 다음과 같이 작동 할 것이다. 컴파일러는 템플릿 코드를 가져 와서 모든 매개 변수를 주어진 매개 변수로 바꾼 다음이 클래스를 간단한 클래스처럼 처리합니다. 지금

내 질문은, 왜 컴파일러은 결코 일어나지 않을 것, 그것이 알고 것들에 대해 저를 경고하고?

그리고 난 단지 경고를 얻는 이유는, 최적화 컴파일?

+0

이 질문은 구체적인 코드 예제를 사용하면 크게 향상 될 것입니다 ... –

+1

경고가 표준 범위에 포함되지 않습니다. 모든 컴파일러는 원하는 품질의 경고를 원하는대로 구현할 수 있습니다. 최적화는 코드 게이트 트리 및 수행 된 흐름 제어 분석의 양에 최적화가 적용되므로 경고에 영향을줍니다. 제 생각에 컴파일러는'dim '와'v'의 차원 (dimensionality) 사이의 관계를 추적 할 수 없으므로 두 함수가 연결되어 있다는 것을 알지 못합니다. –

+0

많은 정보가 누락 되었기 때문에 나는 완전히 확신 할 수 없습니다. 그러나 저에게는 템플릿 전문화가 필요하고, 3을 위해 템플릿 전문화가 필요합니다. –

답변

2

컴파일러는 if 조건이 충족되지 않아도 코드를 컴파일하고 경고를 표시합니다. if 이제까지 실제로 실행되는 것을 방지하거나, 전문 것이기 때문에 당신은 경고를 무시 할 수 있습니다

/SFINAE은/여분의 물건을 할 수있는 클래스는 매개 변수는 3

또는 대기 ~ 오년까지 기능 때 우리는 static_if을 얻습니다.

+0

나는 컴파일러가 조건이 항상 거짓 일지라도 변환한다고 생각했지만 궁금하다. 왜 ** 최적화가 ** 일어 났는지 궁금하다. 필자는 컴파일러가 그런 것들을 고려해야한다고 생각했다. 하지만 당신은 저에게 아이디어를 가져 왔습니다 : Specialization :) –

+0

@Wolfe 최적화 프로그램은 컴파일러 다음에옵니다. 컴파일러는 모든 것이 올바른지 (그리고 경고를내는 것은 작업의 일부 임) 점검해야합니다. 그래서'if (false) this_function_doesnt_exist();'를 할 수없고 여전히 컴파일 할 코드를 얻을 수 있습니다. –