Variadic 模板在目标文件中有重复的符号?
Variadic templates have duplicate symbols in object files?
我有以下测试程序:
#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 的情况下内联。)
@BaummitAugen 和@PaoloCrosetto 为我指出了正确的方向——这显然是一个仅限于旧版本 gcc 的问题,它似乎并没有真正增加已编译可执行文件的大小。
我有以下测试程序:
#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 的情况下内联。)
@BaummitAugen 和@PaoloCrosetto 为我指出了正确的方向——这显然是一个仅限于旧版本 gcc 的问题,它似乎并没有真正增加已编译可执行文件的大小。