将整数零模板参数优化出来

Will integer zero template parameter be optimized out?

本文关键字:优化 参数 整数      更新时间:2023-10-16

假设我有一个模板类:

template <int foo>
class Bar {
private:
    int data[10];
public:
    int getValue(int index) {return data[index + foo];}
    ...
}
Bar<0>  bar;
// Codes to fill bar's data[] here ...
int retValue = bar.getValue(2);

由于模板参数是零,所以当我声明bar时,我想知道在计算数据索引(即index + foo)时,零是否可以/将被优化掉(任何加零的东西都保留自己)。

换句话说,当模板类的实例被启动时,整数模板参数在启动时会被视为参数或常量吗。

无论常数<foo>的值是多少,

gcc肯定会完全优化加法。使用-O2,当<foo>为零时,getValue()方法在具有32位int类型的x86上生成以下汇编语言:

  Bar<0>  bar;
// Codes to fill bar's data[] here ...
  return bar.getValue(2);
}
   e:   8b 44 24 10             mov    0x10(%esp),%eax
  12:   c9                      leave  
  13:   c3                      ret    

要亲自查看汇编语言,请使用-g编译翻译单元,并在对象文件上使用objdump -S