不要考虑众所周知的编译时递归斐波纳契计算。在这种特殊情况下,实例化fibonacci<1>
(或fibonacci<20>
无关紧要多少次?它只是一次吗?如果是,编译器会为我们执行动态编程算法:)
template<int n>
struct fibonacci
{
static const uint64_t value = fibonacci<n - 1>::value + fibonacci<n - 2>::value;
};
template<>
struct fibonacci<0>
{
static const uint64_t value = 0;
};
template<>
struct fibonacci<1>
{
static const uint64_t value = 1;
};
int main()
{
std::cout << fibonacci<80>::value;
}
让我们考虑另一个例子。
int main()
{
std::vector<int> v1;
std::vector<int> v2;
}
C ++编译器是否为vector<int>
的两个实例生成单独的代码?
如果vector<int>
的类似实例位于不同的翻译单元中会怎样?
答案 0 :(得分:3)
C ++标准不强制要求其中一个。只要完成的程序按指定行为运行,编译器就可以执行任何操作,请参阅所谓的“as-if”规则(第1.9-1节)。一个好的编译器不会生成不必要的代码,所以我希望它将fibonacci示例优化为常量,并将矢量示例优化为矢量函数的一个实现。
答案 1 :(得分:0)
在这种特定情况下,斐波那契1的次数是多少。 (或斐波纳契20无关紧要)被实例化了吗?
零对象,只有静态(const!)值。
用
std::vector<int> v1;
std::vector<int> v2;
实例化两个对象。