编译器和链接器如何处理 类 和函数
How does the compiler and linker handle classes and functions
有人可以帮助我理解,为什么我可以在两个不同的编译单元中拥有相同的 class 而不会出现链接器错误,但在不同的编译单元中却没有相同的功能?
非常感谢。
通常,链接器主要了解函数和变量(非成员变量)。
链接器持有的关于类的信息通常与继承的实现有关。成员函数被转换为常规函数,带有额外的隐式 this
参数。访问成员通常只是 this
指针的偏移量。
如果您将继承添加到 类,或者使用 typeid 或 type_info,您可能会开始遇到许多奇怪的行为。
两个组合单元中的相同 class 可能会导致程序格式错误,因为其方法(包括特殊成员,如默认 ctor 或 operator=)具有相同的定义错误.
我的特殊成员函数是隐式内联定义的,因此我们很容易得到不需要诊断的格式错误的程序。
因此我的内存损坏了;具有相同名称和不同内存布局的两个矩阵 class。
有人可以帮助我理解,为什么我可以在两个不同的编译单元中拥有相同的 class 而不会出现链接器错误,但在不同的编译单元中却没有相同的功能?
非常感谢。
通常,链接器主要了解函数和变量(非成员变量)。
链接器持有的关于类的信息通常与继承的实现有关。成员函数被转换为常规函数,带有额外的隐式 this
参数。访问成员通常只是 this
指针的偏移量。
如果您将继承添加到 类,或者使用 typeid 或 type_info,您可能会开始遇到许多奇怪的行为。
两个组合单元中的相同 class 可能会导致程序格式错误,因为其方法(包括特殊成员,如默认 ctor 或 operator=)具有相同的定义错误.
我的特殊成员函数是隐式内联定义的,因此我们很容易得到不需要诊断的格式错误的程序。
因此我的内存损坏了;具有相同名称和不同内存布局的两个矩阵 class。