首页 > 解决方案 > 减少普通类型 std::vector 模板实例化数量的选项

问题描述

假设我有以下示例代码只是为了实例化std::vector至少两种普通类型的 insert 方法:

#include <vector>

void insert(std::vector<int>& v, int const* a, int const* b)
    { v.insert(v.end(), a, b); }

void insert(std::vector<short>& v, short const* a, short const* b)
    { v.insert(v.end(), a, b); }

如果您编译此代码,您将获得相同代码的几乎完全相同的副本(请参阅此处的编译方式)。

是否可以在不滚动您自己的假设 T 微不足道的专用 std::vector 的情况下实现更紧凑的代码?所以在真正的实现中可以把类型扔掉,所以繁重的工作可以直接用memcpyand来实现realloc。我猜这个根据标准的解决方案是UB。

例如,编译器没有合并uninitialized_copy. 我意识到不允许将两个不同的符号映射到同一个地址,但至少不能用跳转到第一个副本替换第二个副本。这甚至不会发生在-Os.

标签: c++compiler-optimizationinstantiationcode-duplicationfunction-templates

解决方案


推荐阅读