【问题标题】:Does removing const from a function return type break ABI?从函数返回类型中删除 const 是否会破坏 ABI?
【发布时间】:2016-05-31 13:50:57
【问题描述】:

假设我有一个库,它声明了一个返回 const 类型的函数:

class Foo { ... };
const Foo makeFoo();

现在我想从makeFoo() 返回类型中删除const(参见我的previous question)。我可以从头文件和 cpp 文件中删除const,重建库,并将我的代码链接到新库。但是,我也有动态链接到这个库的旧代码,我希望它继续与新版本的库一起工作。

那么,第一个问题,从返回类型中删除 const 会破坏 ABI 吗?

第二个问题,实际代码完全不同:它是一个模板类,有一个静态成员函数,后来显式实例化:

// fooMaker.h
template<class Foo>
class FooMaker {
public:
    static const Foo make();
};

// fooMaker.cpp
template<class Foo>
const Foo FooMaker<Foo>::make() { ... }

template class FooMaker<Foo1>;
template class FooMaker<Foo2>;

有什么改变吗?

如果这很重要,我在 linux 下使用 g++。

【问题讨论】:

  • @ZunTzu,事实上我看到了两个可能的问题:名称修改和可能的 UB 由于将非 const 对象处理为 const (想象我是 adding const 而不是删除;那么这显然会导致 UB,类似于我之前的问题)。对于前者,我对 g++/linux 的实际答案更感兴趣,好像 g++ 更改了名称修饰方案,那么这将不是唯一的问题。对于后者,我对合法的答案更感兴趣,因为留下一些 UB 或类似的东西是不好的。
  • 由于返回类型不是重整函数名称的一部分,因此对名称重整没有影响。
  • 实用答案:g++ name mangling 显然不使用返回类型(见here)。
  • 法律答案:上次我检查 C++ 时没有标准 ABI。
  • 在法律方面:如果定义以这种方式与声明不同,则您违反了 ODR。实际上我怀疑这很重要。

标签: c++ constants abi


【解决方案1】:

以下关于影响 ABI 的 guidelines 表明答案是肯定的,它确实破坏了 ABI 兼容性:

你不能

...

对于任何类型的现有函数:

  • 更改 以任何方式返回类型

由于您将返回类型从 const Foo 更改为 Foo 我会说这很不妥。

【讨论】:

  • 在这种情况下这个答案是不够的。更改是否足够有意义以影响 ABI 并不明显(返回 const 类型实际上什么也没做)。
  • guidelines 来自 KDE 社区,它更像是一组观察结果,可以保证大部分安全编码。这意味着我不把它作为有价值的参考。为此,它需要来自编译器的创建者/手册/等。我也理解尊子的疑惑。删除 const/volatile 修饰符“感觉美观”,它不应该影响任何东西的结构/大小/等。虽然我可以想象一个编译器根据 const 不同地为返回值分配空间,但它会是..奇怪,非常奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多