[英]What is the logic of demangling?
我有这样的代码。 代码正在运行我知道代码打印 'm' 因为 demangling ( https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html )
但是为什么编译器为size_t
打印'm'? 映射的逻辑是什么 ('i' --> int
// 很清楚,但是为什么 'm' --> size_t
)
#include <typeinfo>
using namespace std;
int main() {
size_t i = 5;
cout << "Type: " << typeid(i).name() << '\n'; // Type: m
}
如果您检查itanium ABI ,您会看到所有无符号类型都使用字母表中的下一个字母(除了char
之外)。 int
是i
, unsigned int
是j
。 long
是l
, unsigned long
是m
。 由于size_t
不是 itanium 类型,它由unsigned long
表示,因此由m
表示。
分配的字母基本上是任意的,所以尽管它们的分配有一些逻辑,但它们到底是什么并不重要。 它们是实现细节并且是特定于平台的,如果您需要知道它们的含义,请使用像c++filt
、 http://demangler.com/或abi::__cxa_demangle 这样的 demangler
但为什么编译器会为 size_t 打印“m”?
因为size_t
在这个平台上是unsigned long
,而字母m
在这个平台上这个编译器里代表unsigned long
。
映射的逻辑是什么('i' --> int // 很清楚,但是为什么'm' --> size_t)
没有“逻辑”,只有规定什么字母是什么类型的规则。 参见https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling-builtin 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.