gpt4 book ai didi

c++ - private/protected/public 如何影响 ABI?

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:16 25 4
gpt4 key购买 nike

我想要的是一些类(class)成员有时是private,而其他时候是public。这些成员应该可以被某些模块访问,而其他模块不能访问。

成像这个类:

class Foo {
public:
...
private:
...
protected:
...
internal:
int x;
};

在模块 X 中,internal 定义为:

#define internal public

在模块 Y 中定义为:

#define internal private

所以真正的问题是这个技巧是否可以被标准接受,或者它是否会以任何方式改变类(或其成员)的签名。

我知道 friendPIMPL 适合这种工作,但是 friend 会变得非常困惑,PIMPL 的性能(间接和不能内联的事实)对于我正在处理的代码库来说是 Not Acceptable 。

最佳答案

这是一个 ODR违反并因此调用未定义的行为。 (另请参见 basic.def.odr]/6.1“D 的每个定义应由相同的标记序列组成”)。

然而,一个常见的实现是 public、private、protected 对类布局没有影响,所以它会起作用。

你如履薄冰;没有什么可以阻止编译器将所有公共(public)成员放在第一位,然后是 protected 成员,然后是私有(private)成员。更重要的是,一般来说声明的顺序要求是内存中的顺序所以

struct T {char a; int b; char c};

需要有a,然后是b,然后是c。这是为了确保 C 兼容性。但是,对具有不同访问权限的元素的排序没有要求(参见 [class.mem]/9.2 p13:“分配具有相同访问控制(第 11 条)的(非 union )类的非静态数据成员,以便后来的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序未指定(第 11 条)”。所以给定

struct T {char a; int b; private: char c};

编译器可以重新排序成员并将c放在ab之间。

EJP 的最后说明以及其他认为这些是声明而不是定义的人:我在上面给出了 T 的两个定义声明看起来像struct T;

编辑:感谢Fanael从标准中引用。

关于c++ - private/protected/public 如何影响 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45981306/

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