3

如果我使用模板类创建 30 个不同的定义。我的问题是它会编译成 30 个二进制的实际类(二进制大小 = sizeof(template_class) x 30),尽管它们的实际代码非常相似甚至完全相同?

如果可以,并且在运行时,我的程序将加载到内存中。我遍历这 30 个实例(假设我为每个定义初始化了 1 个实例),是否会导致 cpu 指令缓存重新加载,因为它们实际上是内存中的 30 个副本,即使它们的大部分代码都是相同的?

    template<typename msg_policy, int id>
    class temp_class_test : public msg_policy
            //codes, methods, and members
    };

    template class temp_class_test<A_policy,1>;
    template class temp_class_test<B_policy, 2>;
4

3 回答 3

2
于 2013-03-18T11:05:42.237 回答
2

如果你的 30 多个类非常相似,你应该避免代码重复。例如,模板参数id可能只是一个存根,以区分其他相同的类。在这种情况下,您不需要为 every 重新定义类id,而可以简单地从实现中继承:

namespace implementation {
  template<typename p> class test {
    // implementation
  };
}
template<typename p, int id>
class temp_class_test : public implementation::test<p>
{
   // any additional code dependent on id
   // any non-inheritable code (constructors)
};

然后编译器将只为基类的每个方法生成一个二进制文件,并且id仅用于区分不同的temp_class_test.

于 2013-03-18T11:08:36.510 回答
0

验尸完毕。这就是为什么当我的应用程序处于压力之下时我的应用程序表现如此糟糕的原因。这是因为我的 cpu 经历了永远的缓存未命中。

于 2013-03-18T11:17:11.470 回答