C ++模板 - 代码用法,二进制文件的大小

时间:2017-12-18 11:24:51

标签: c++ templates code-size

我想知道模板代码的代码大小。 请考虑以下代码

template<typename T>
class vector
{
public:

vector(size_t size) :
{
    array = NEW T[size];
}


uint32_t push_back(T value)
{
... adding value to array and possible array realloction..  
}

private:
T * array;
}

当我有两个矢量实例时,

vector<float> v1;
vector<int> v2;

将使用两个push_back实现

编译为二进制文件
push_back(float)
push_back(int)

或只有一个或其他什么?

是否可以使用模板而不是floatint的单独类来缩小代码大小?

1 个答案:

答案 0 :(得分:0)

从模板实例化的类和函数在运行时它们之间没有任何关系,因此函数将被复制。

某些编译器会优化共享/重复代码,但此优化的范围比模板实例宽。

请注意,即使代码看起来相同,也可能在使用某些运算符时触发不同的函数调用。

对于像var str = `<Field name="amount" component={FormField} label={t('form.amount')} /> <Field name="datereception" component={FormField} label={t('form.datereception')} /> <Field component={FormField} name="document" typeInput="selectAutocomplete" /> <Field name="datedeferred" component={FormField} label={t('form.datedeferred')} /> <FieldArray component={FormField} typeInput="selectAutocomplete" name="document" /><FieldArray component={FormField} typeInput="selectAutocomplete" name="document" />` ; str = str.replace(/<Field(?:Array)?\b(?=[^\/>]+name="document")[^>]+\/>/g, ""); console.log(str);std::vector<int*>这样的指针容器尤其明显,虽然它们的行为实际上是相同的,但它们将获得不同的功能。

总而言之,模板在减少代码大小方面非常出色,但是创建许多不同的实例会使二进制文件膨胀。