示例代码:
// 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'指针的值放入寄存器。
我希望这能打破二进制兼容性,但我似乎无法在任何“二元兼容性问题”列表中找到它。是否要求所有成员函数,无论是否触及内部,都有这个指针?检查核心中的gdb输出(我不能在这里复制/粘贴:(抱歉)暗示不是。
出于这个问题的目的,请假设这里没有内联(通过GCC never_inline属性)
答案 0 :(得分:2)
成员函数总是使用this
指针调用 [1] ,无论是否使用它。这样编译器就不必“知道”某个函数是否使用this
指针。考虑这样一种情况,即函数仅作为头文件中的声明包含在内,而实际的实现是在不同的源文件中单独编译的 - 编译器将如何知道?或者在函数是虚拟的情况下,并且存在多个可能的类,其中一些使用,并且其中一些不在成员函数内使用this
(隐式)。
这不适用于static
成员函数 - 这是static
成员函数的一部分。
[1] 当然,在编译器可以“看到”函数的源代码的情况下,它可以选择内联实际函数,如果是this
指针未被使用,然后可以作为内联过程的一部分将其删除。但这也不是兼容性的中断。