1
나는 C++ 템플릿 정적 멤버 변수가 인스턴스화를 필요로하는 것을 결정하는 방법을 알아 내기 위해 노력하고 있으며 혼란 스럽다. 내가 그것을 실행하면템플릿 정적 멤버 변수의 인스턴스화
#include <stdio.h>
#include <typeinfo>
int report(const char *name)
{
printf("Reporting class: %s\n", name);
return 0;
}
template<typename ReportedClass>
class reported_class
{
public:
reported_class()
{
_reported_instances++;
}
private:
static int _reported_instances;
};
template<typename ReportedClass>
int reported_class<ReportedClass>::_reported_instances = report(typeid(ReportedClass).name());
class foo : reported_class<foo>
{
public:
int baz() { return 0; }
};
class bar : reported_class<bar>
{
public:
bar() { }
int baz() { return 0; }
};
int main(int argc, char **argv)
{
return 0;
}
, 나는 다음을 참조하십시오 :
이$ c++ -v
Apple LLVM version 5.0 (clang-500.0.68) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
$ c++ test.cpp
$ ./a.out
Reporting class: 3bar
$
왜 reported_class의 정적이 인스턴스화되고 있지만 foo에 대한 하나의
다음 코드를 감안할 때? 유일한 차이점은 생성자가있는 것으로 보이지만, 두 경우 모두 reported_class 생성자가 호출되기를 기대합니다. 따라서 생성자에서 사용하기 때문에 정적 인스턴스화가 필요합니다. 내가 알지 못하는 표준에서 이것에 대한 이유가 있습니까? 그리고 이것에 의존 할 수있는 것이 있습니까?
GCC-4.7.3은 같은 동작을 표시합니다, 그래서 나는 이것이 당신이 클래스 중 하나를 인스턴스화하지있는 표시되지 main
기능에 분명히 뭔가가 I "m 오해.
추가 주() 재미 당신이 추측했듯이, 어떤 클래스도 인스턴스화하지 않습니다. 귀하의 설명은 그럴듯 해 보일 수 있지만,이 경우보고 된 클래스의 인스턴스 화가 의존 될 수 있습니까? 아니면 컴파일러가 객체를 구성하지 않아도 완전히 최적화 할 수 있습니까? –
kihlasht
@kihlasht : 표준이 잘 정의 된 부작용을 보전하기 위해 일반적으로 고통을 겪기 때문에 나는 생각하지 않을 것입니다. 생성자 또는 소멸자가 부작용을 가질 수있는 경우 사용되지 않는 변수가 최적화되지 않도록 허용하지 않습니다. 하지만 나는 * 알지 못한다. 따라서 문제가된다면 새로운 질문으로 물어볼 것을 제안합니다. (개인적으로 개인적으로는 전문가가 희망을 품고 그 중 하나가 연구하고 분석 할 시간을 알고 있거나 걸리며 머피의 법에 따라 컴파일러가 잘못 처리해야하는 경우). –