gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:48 38 4
gpt4 key购买 nike

示例代码:

// 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/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com