gpt4 book ai didi

c++ - 模板的实例化会导致二进制代码重复,编译器会阻止它吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:41 25 4
gpt4 key购买 nike

假设,我们声明模板:

template <class functor, int index>
class MyClass
{
public:
MyClass(){someFunction(index);}
private:
void someFunction(int index)
{
while(index--)
functor();
}
int commonFunction(void)
{
return M_PI;
}
};

请注意,commonFunction 方法 不依赖于模板参数。

客户使用这个模板:

MyClass<func1,100> t1;
MyClass<func2,100> t2;
// ...
MyClass<funci,100> ti;
// where i, for example in 1 .. 1000

模板的实例化会导致二进制代码中commonFunction的重复吗?
编译器可以防止这种重复吗?
C++ 标准是否定义了可以防止重复,因此每个编译器都应该提供优化?

当然,这可以通过在基类中实现所有模板的通用功能并在模板化类中移动差异来轻松解决,如下所示:

class baseMyClass
{
int commonFunction(void)
{
return M_PI;
}
};

template <class functor, int index>
class MyClass : private baseMyClass
{
public:
MyClass(){someFunction(index);}
private:
void someFunction(int index)
{
while(index--)
functor();
}
};

但是我的问题的目的是为了找出:
标准是否定义了在看起来像我给出的优化的情况下应该执行,所以我们可以简单地使用模板并依赖编译器?

最佳答案

Does standart defines that in the cases that look like the one I gave optimization should be performed, so we can simply use template and rely on a compiler?

不,标准不以任何方式要求符合标准的编译器执行此类优化。众所周知,代码膨胀是模板的缺点之一。

这就是说,因为你的函数除了返回一个常量之外不做任何事情,它可能会被内联,即使它不会被内联,链接器也可能会识别出该函数的几个相同的实例化已经生成,并将它们全部合并。

但是,标准并未强制执行此行为

关于c++ - 模板的实例化会导致二进制代码重复,编译器会阻止它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com