c++ - 更改添加隐藏 this 指针的方法是否会破坏二进制兼容性?

标签 c++ g++

示例代码:

// Base.hpp
class Base
{
   public:
   void changeInternals();
   int readInternals();
   void printString(std::string& iString);

   private:
   int m_Internal;
};

// Base.cpp
void Base::changeInternals()
{
   m_InternalValue = 5;
}
int Base::readInternals()
{
   return m_InternalValue;
}
void Base::printString(std::string& iString)
{
   std::cout << iString << std::endl;
}

我的理解是,在g++的优化下,前两个成员函数(changeInternal和readInternal)将把'this'指针作为函数参数的一部分,因此它可以访问成员变量m_Internal。但是,第三个成员函数 printString 不需要查看成员变量,因此参数中不会有 this 指针?

在这种情况下,如果我们这样改变:

 void Base::printString(std::string& iString)
 {
    std::cout << boost::lexical_cast<std::string>(m_Internal) << std::endl;
 }

成员函数现在需要访问 m_Internal,因此需要该函数的调用者将“this”指针的值放入寄存器中。

我希望这会破坏二进制兼容性,但我似乎无法在任何“二进制兼容性陷阱”列表中找到它。是否要求所有成员函数,无论是否触及内部,都必须有 this 指针?检查内核中的 gdb 输出(遗憾的是,我无法在此处复制/粘贴:(,抱歉)意味着不能。

出于此问题的目的,请假设此处未发生内联(通过 GCC never_inline 属性)

最佳答案

成员函数始终[1]使用this指针调用,无论是否使用。这样编译器就不必“知道”某个函数是否使用 this 指针。考虑这样的情况:该函数仅作为声明包含在头文件中,而实际实现是在不同的源文件中单独编译的 - 编译器如何知道?或者在函数是虚函数的情况下,并且有多个可能的类,其中一些在成员函数内部使用 this (隐式)。

这不适用于static成员函数 - 这是static成员函数的要点的一部分。

[1] 当然,在编译器可以“看到”函数源代码的情况下,它可能会选择内联实际函数,并且如果 this 指针未被使用,然后可以作为内联过程的一部分将其删除。但这并不是兼容性的破坏。

关于c++ - 更改添加隐藏 this 指针的方法是否会破坏二进制兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17673874/

相关文章:

c++ - 如何使用 visual studio 调试 Borland BCC55 编译的 EXE?

c++ - SIGSEGV 带有指向模板对象的指针的 std::map

c++ - 使用 STL 数据结构

ubuntu - ld : "undefined reference to symbol ' sqrtf'"error with G++ via Apache Ant

c++ - 如何检查 Linux 操作系统中使用的 C++ 版本?

android - 无法使用 Android NDK 构建 gstreamer

c++ - 编译期间未识别的引用错误

c++ - 多项式代码

c++ - 是否可以通过每次仅在内存中保存一个图 block 来处理完整的图 block tiff 图像?

gcc - gcc和g++/gcc-c++有什么区别?