gpt4 book ai didi

c++ - 查看函数模板实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:00 25 4
gpt4 key购买 nike

我有一个简单的函数模板:

#include <iostream>
using namespace std;

template <class T>
T GetMax (T a, T b) {
T result;
result = (a > b) ? a : b;
return (result);
}

int main () {
cout << GetMax<int>(5, 6) << endl;
cout << GetMax<long>(10, 5) << endl;
return 0;
}

上面的示例将生成 2 个函数模板实例化,一个用于 int,另一个用于 long。是否有任何 g++ 选项可以查看函数模板实例化?

最佳答案

您可以使用nm 程序(binutils 的一部分)来查看程序使用的符号列表。例如:

$ g++ test.cc -o test
$ nm test | grep GetMax
00002ef0 T __Z6GetMaxIiET_S0_S0_
00002f5c T __Z6GetMaxIiET_S0_S0_.eh
00002f17 T __Z6GetMaxIlET_S0_S0_
00002f80 T __Z6GetMaxIlET_S0_S0_.eh

我不知道为什么每个都有两个拷贝,一个带有.eh 后缀,但否则你可以看出这个特定的函数被实例化了两次。如果您的 nm 版本支持 -C/--demangle 标志,您可以使用它来获得可读的名称:

$ nm --demangle test | grep GetMax
00002ef0 T int GetMax<int>(int, int)
00002f5c T _Z6GetMaxIiET_S0_S0_.eh
00002f17 T long GetMax<long>(long, long)
00002f80 T _Z6GetMaxIlET_S0_S0_.eh

如果不支持该选项,您可以使用 c++filt拆解它们:

$ nm test | grep GetMax | c++filt
00002ef0 T int GetMax<int>(int, int)
00002f5c T __Z6GetMaxIiET_S0_S0_.eh
00002f17 T long GetMax<long>(long, long)
00002f80 T __Z6GetMaxIlET_S0_S0_.eh

因此,您可以看到 GetMax 分别用 intlong 实例化。

关于c++ - 查看函数模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1997119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com