为什么名称重整不规范
Why is name mangling not standardized
我只是想知道为什么名称重整从未被C++标准标准化。显然,使用不同的名称重整算法会损害互操作性[1],而且我认为将其定义在实现上没有任何优势。
也就是说,与调用约定或原语大小相反,机器本身并不关心甚至不知道函数是如何调用的。那么为什么它没有标准化,为什么它仍然没有标准化呢?编译器过去在版本之间更改了规则。
[1] 所有这些将功能导出为extern "C"
的人都说明了一切。
该标准不涉及实现细节。 有很多,许多事情依赖于实现,并且阻止了一起工作的程序:课程是如何布局的,vtable
的结构等。 通常,编译器会更改如果他们更改其中任何一个,则名称重整。 这是故意的,因为它防止链接无法正常工作的代码。
给定的平台可以定义一个C++ ABI;所有编译器遵守它将使用兼容的实现,并具有俗名重音。 这是平台供应商的问题,然而;无论出于何种原因,很少有供应商定义了C++ ABI。
extern "C"
工作的原因是因为几乎所有平台都定义了C ABI。
该标准实际上不需要名称重整。 就此而言,该标准不需要IEEE浮点数或任何其他东西。
在有一个可以依赖的广泛 ABI 之前,GCC 实际上不遗余力地使用与其竞争对手不同的名称重塑方案:
G++ 不像其他C++编译器那样执行名称重整。这意味着使用一个编译器编译的目标文件不能与另一个编译器一起使用。
这种效果是有意为之的,以保护您免受更微妙的问题。编译器在C++实现的许多内部细节方面有所不同,包括:类实例的布局方式、多重继承的实现方式以及如何处理虚函数调用。如果名称编码相同,您的程序将链接到其他编译器提供的库 - 但程序在运行时会崩溃。然后在链接时而不是运行时检测不兼容的库。
名称重整也比许多程序员意识到的要复杂得多。 例如,标准如何为C++可以运行的所有平台指定可接受的调用约定? 是否应该要求RISC系统支持x86 stdcall
即使RISC系统通常在寄存器中而不是堆栈上传递其参数?
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在运行时没有向我们提供有关分段错误的更多信息?