0

这可能是一个非常明显的问题,但我想在继续我的开发之前确定它。

我有一个模板类,例如:

template<TypeA var1, TypeB var2>
class myClass
{
  //Attributes
  ...
  //Methods
  ...
  void checkHit(vector<Real>* path, vector<bool>* active)
  {
    for(int i = 0; i < N; i++)
    {
      //Some process
      bool hit = ((var1 == Up) || (var1 == Down));
    }
    //...
    bool flag = ((var2 == Left) || (var2 == Right));
  }
}

如果我创建和对象喜欢

myClass obj<Up, Right>(...);

执行方法时

obj.checkHit( ... );

程序会检查bool hit = ((var1 == Up)(var2 == Right)吗??换句话说,编译器会丢弃与传递的模板参数无关的代码吗?我的意思是,如果编译后的结果代码类似于

template<TypeA var1, TypeB var2>
class myClass
{
  //Attributes
  ...
  //Methods
  ...
  void checkHit(vector<Real>* path, vector<bool>* active)
  {
    for(int i = 0; i < N; i++)
    {
      //Some process
      bool hit = ((var1 == Up)); //Like if I have never put "|| (var1 == Down));"
    }
    //...
    bool flag = ((var2 == Right));
  }
}

希望这个例子足够清楚,我只是简化了(很多)真正的代码,但它应该大致等价。如果不清楚,请告诉我,我很乐意改进它。

4

3 回答 3

1

这个例子还不够清楚,没有“与传递的模板参数无关的代码”,因为没有任何东西依赖于hitor flag,所以一个体面的优化器会checkHit变成一个完全空的函数!

编译器可以在编译时评估((var1 == TypeA::Up) || (var2 == TypeB::Down))条件,一个合适的优化编译器会将该条件的结果传播到函数的其余部分,删除由于该条件的值而永远不会运行的任何死代码。

另外,您真的想按值传递这些参数吗?

void checkHit(vector<Real> path, vector<bool> active)
于 2013-08-21T13:40:44.663 回答
1

我假设您的TypeAandTypeB是枚举还是某种定义了这些值的类/结构?

在这种情况下,编译器不会在这里“丢弃”代码。您的条件检查以查看模板参数是什么,因此如果它们与条件中的内容不匹配,您最终会得到一个基本上会执行此操作的调用:

bool hit = (0 == 1 || 1 == 2);

根据您的优化设置,编译器可能会意识到这将始终为 false 并将其设置为 false(还假设您在函数中执行了一些有用的操作,因此编译器不会将其变为 noop)。

你还应该通过引用(或常量引用)传递你的向量,我会避免使用vector<bool>.

于 2013-08-21T13:46:14.150 回答
0

程序不会丢弃代码的任何部分。模板类仅用于概括类的使用。一旦选择typeAType B选择它们,它们都将被视为整个代码Type AType B其余代码将在没有任何模板的正常方式

于 2013-08-21T13:47:25.280 回答