2

示例代码:

// 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 属性)

4

1 回答 1

2

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

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

[1]当然,在编译器可以“看到”函数源代码的情况下,它可以选择内联实际函数,如果this指针没有被使用,则可以将其作为内联过程。但这又不是兼容性的中断。

于 2013-07-16T10:31:55.833 回答