了解 C++ 中映射和向量的 typeid.name() 输出

Understanding typeid.name() output for Maps and Vectors in C++

有人可以帮助更好地理解 typeid.name() 在地图和矢量上的输出吗?请在下面找到我的程序及其输出。

例如:std::map<int,int> 的输出结果为 TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE],我可以在其中稍微解读一下,即 std::mapmap当然,Iii 代表 int,int 但其余字符是什么意思?

程序:[=3​​2=]

#include <iostream>
#include <map>
#include <vector>
#include <typeinfo>

using namespace std ;

template <class A>
void showtype (A x)
{
        cout<<"TYPE is: ["<<typeid(x).name()<<"]\n" ;
}

int main()
{
        std::map<int,int> iM ;                  showtype(iM) ;
        std::map<int,std::string> isM ;         showtype(isM) ;
        std::map<std::string,std::string> ssM ; showtype(ssM) ;
        std::vector<std::string> sV ;           showtype(sV) ;
        std::vector<int> iV ;                   showtype(iV) ;
        return 0 ;
}

输出:

%_Host@User> ./typeid.name
TYPE is: [St3mapIiiSt4lessIiESaISt4pairIKiiEEE]
TYPE is: [St3mapIiSsSt4lessIiESaISt4pairIKiSsEEE]
TYPE is: [St3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE]
TYPE is: [St6vectorISsSaISsEE]
TYPE is: [St6vectorIiSaIiEE]
%_Host@User>

您的平台使用 Itanium ABI,尤其是 ABI 的 name mangling scheme。详细规则在链接规范中。

您的库实现选择 return 名称的(重要部分)因此从 std::type_info::name 中损坏。这是标准不需要的幸运巧合(事实上,标准没有链接和名称修改的概念)。

GCC 的 ABI 库包含在 abi::__cxa_demangle 中分解名称的函数(但不要在不受信任的输入上使用它,因为它充满漏洞!)。还有一个 free-standing 命令行工具可以对 Linux、c++filt 和 Linux binutils(nmobjdumpreadelf) 也可以分解名称。 (出于同样的原因,不要 运行 那些不受信任的输入。)