使用pass-by-reference而不是pass-by-pointer时的二进制兼容性

PiJ*_*PiJ 4 c++ interface-design pass-by-reference binary-compatibility pass-by-pointer

这个问题是作为这个问题的后续问题:C++中指针变量和引用变量之间有什么区别?

阅读了我在stackoverflow上找到的答案和一些进一步的讨论后,我知道编译器应该像处理pass-by-pointer一样对待pass-by-reference,而引用只不过是语法糖.考虑到二进制兼容性,如果存在任何差异,我还无法弄清楚一件事.

在我们的(多平台)框架中,我们要求在发布和调试版本之间(以及框架的不同版本之间)进行二进制兼容.特别是,我们在调试模式下构建的二进制文件必须可用于发布版本,反之亦然.为此,我们只在接口中使用纯抽象类和POD.

请考虑以下代码:

class IMediaSerializable
{
public:
    virtual tResult Serialize(int flags,
                              ISerializer* pSerializer,
                              IException** __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)

ISerializer并且IException也是纯粹的抽象类.ISerializer必须指向现有对象,因此我们总是必须执行NULL指针检查.IException实现某种异常处理,其中指针指向的地址必须改变.出于这个原因,我们使用指向指针的指针,指针也必须是NULL指针.

为了使代码更清晰并省去一些不必要的运行时检查,我们希望使用pass-by-reference重写此代码.

class IMediaSerializable
{
public:
    virtual tResult Serialize(int flags,
                              ISerializer& pSerializer,
                              IException*& __exception_ptr) = 0;
//[…]
};
Run Code Online (Sandbox Code Playgroud)

这似乎没有任何缺陷.但问题仍然是我们是否仍然满足二进制兼容性的要求.

更新: 澄清事情:这个问题不是关于代码的pass-by-pointer版本和pass-by-reference版本之间的二进制兼容性.我知道这不能是二进制兼容的.事实上,我们有机会重新设计我们的API,我们考虑使用pass-by-reference而不是pass-by-pointer而不关心二进制兼容性(新的主要版本).问题只是关于仅使用代码的pass-by-reference版本的二进制兼容性.

Sam*_*hik 6

二进制ABI兼容性由您使用的任何编译器决定.C++标准不包括二进制ABI兼容性问题.

您需要检查C++编译器的文档,以了解它对二进制兼容性的看法.