可变参数模板在目标文件中有重复的符号?

时间:2018-06-29 13:26:53

标签: c++ c++11 templates variadic-templates nm

我有以下测试程序:

#include <cstdio>

template<int i, int j, int k>
struct Dispatcher {
  template<typename... F>
  static inline void call1(bool a, bool b, int* output, F...) {
    *output = i;
    if (a) *output += j;
    if (b) *output += k;
  }

  template<typename F>
  static inline void call2(bool a, bool b, int* output, F) {
    *output = i;
    if (a) *output += j;
    if (b) *output += k;
  }
};


int main() {
  int output;
  Dispatcher<1, 2, 3>::call1(true, false, &output, 1337);
  printf("%i\n", output);
  Dispatcher<1, 2, 3>::call2(true, false, &output, 1337);
  printf("%i\n", output);
  return 0;
}

该程序可以按预期的方式构建和运行,但是“ nm -C”显示它包含以下符号:

000000000040065a W void Dispatcher<1, 2, 3>::call1<int>(bool, bool, int*, int)
000000000040065a W void Dispatcher<1, 2, 3>::call1<int>(bool, bool, int*, int)
00000000004006a4 W void Dispatcher<1, 2, 3>::call2<int>(bool, bool, int*, int)

在不进行拆散的情况下,它们是:

000000000040065a W _ZN10DispatcherILi1ELi2ELi3EE5call1IIiEEEvbbPiDpT_
000000000040065a W _ZN10DispatcherILi1ELi2ELi3EE5call1IJiEEEvbbPiDpT_
00000000004006a4 W _ZN10DispatcherILi1ELi2ELi3EE5call2IiEEvbbPiT_

为什么函数“ call1”只出现两次,而“ call2”只出现一次?似乎与可变参数模板参数有关...

我正在使用带有“ -std = c ++ 11 -O0”标志的gcc版本4.8.5进行构建。 (即使在我的真实代码中使用-03,我也遇到了问题,但是测试程序内联时没有-O0。)

1 个答案:

答案 0 :(得分:0)

@BaummitAugen和@PaoloCrosetto向我指明了正确的方向-这显然是仅限于旧版gcc的问题,似乎并没有真正增加已编译可执行文件的大小。