gpt4 book ai didi

c++ - 使用按引用传递而不是按指针传递时的二进制兼容性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:04 28 4
gpt4 key购买 nike

此问题旨在作为此问题的后续问题:What are the differences between a pointer variable and a reference variable in C++?

阅读我在 stackoverflow 上找到的答案和一些进一步的讨论后,我知道编译器应该像对待指针传递一样对待传递引用,并且引用只不过是语法糖。一件事我还没有弄清楚考虑到二进制兼容性是否有任何区别。

在我们的(多平台)框架中,我们需要在发布和调试版本之间(以及框架的不同版本之间)实现二进制兼容。特别是,我们在 Debug模式下构建的二进制文件必须可用于发布构建,反之亦然。为实现这一目标,我们仅在接口(interface)中使用纯抽象类和 POD。

考虑以下代码:

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

ISerializerIException 也是纯抽象类。 ISerializer 必须指向一个现有对象,所以我们总是必须执行 NULL 指针检查。 IException 实现了某种异常处理,其中必须更改指针指向的地址。出于这个原因,我们使用指向指针的指针,它也必须经过 NULL 指针检查。

为了使代码更清晰并摆脱一些不必要的运行时检查,我们想使用引用传递重写这段代码。

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

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

更新:澄清一下:这个问题不是关于代码的指针传递版本和引用传递版本之间的二进制兼容性。我知道这不能二进制兼容。事实上,我们有机会重新设计我们的 API,我们考虑使用引用传递而不是指针传递而不关心二进制兼容性(新的主要版本)。问题仅在于仅使用代码的引用传递版本时的二进制兼容性。

最佳答案

二进制 ABI 兼容性取决于您使用的编译器。 C++ 标准不包括二进制 ABI 兼容性问题。

您需要查看 C++ 编译器的文档,了解它对二进制兼容性的说明。

关于c++ - 使用按引用传递而不是按指针传递时的二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28478551/

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