c++ - 私有(private)/ protected /公共(public)如何影响 ABI?

标签 c++ oop

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

对此类进行成像:

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

在模块 X 中,内部定义为:

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

相关文章:

c++ - 使用 mingw 将静态库 (.a) 链接到 exe

c++ - 如何读取要通过套接字发送的图像?

c++ - 查看编译器生成的默认函数?

javascript - 如果我在构造函数中导入模块怎么办?

java - 我们可以创建接口(interface)的对象吗?

c++ - 用 return 语句结束析构函数是否安全?

php - 如何使用 OOP 从另一个 .php 到另一个 .php 的类使用 $db?

python - 如何在基类内部声明子类对象而不导致递归错误?

javascript - 在 Javascript 中创建类 getter/setter 的最佳方法?

c++子线程在main()父线程退出时终止?