저는 우분투 12.04 및 g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5)에서 C++로 프로그래밍하고 있습니다. 4.6.3.템플릿 길이로 배열에 액세스 할 때 Bogus "배열 첨자가 배열 경계 위에 있습니다"경고
은 내가 템플릿 벡터 클래스 유형 type
의 length
구성 요소가
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이면 할당이 문제를 일으키지 않기 때문이다.
필자는 항상 생각했다. 템플릿 작업은 다음과 같이 작동 할 것이다. 컴파일러는 템플릿 코드를 가져 와서 모든 매개 변수를 주어진 매개 변수로 바꾼 다음이 클래스를 간단한 클래스처럼 처리합니다. 지금
내 질문은, 왜 컴파일러은 결코 일어나지 않을 것, 그것이 알고 것들에 대해 저를 경고하고?
그리고 난 단지 경고를 얻는 이유는, 최적화 컴파일?
이 질문은 구체적인 코드 예제를 사용하면 크게 향상 될 것입니다 ... –
경고가 표준 범위에 포함되지 않습니다. 모든 컴파일러는 원하는 품질의 경고를 원하는대로 구현할 수 있습니다. 최적화는 코드 게이트 트리 및 수행 된 흐름 제어 분석의 양에 최적화가 적용되므로 경고에 영향을줍니다. 제 생각에 컴파일러는'dim '와'v'의 차원 (dimensionality) 사이의 관계를 추적 할 수 없으므로 두 함수가 연결되어 있다는 것을 알지 못합니다. –
많은 정보가 누락 되었기 때문에 나는 완전히 확신 할 수 없습니다. 그러나 저에게는 템플릿 전문화가 필요하고, 3을 위해 템플릿 전문화가 필요합니다. –