示例代码:
// 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/