除了对派生类可见或不可见的正常表达外,还有其他区别吗?
如果你让它更明显,它是否会带来更多或更少的记忆,它会减慢速度还是......?
答案 0 :(得分:6)
除了外部成员或派生类的成员可访问性之外,访问说明符可能会影响对象布局。
引用我的other answer:
通常,数据成员的内存地址按照它们在类中定义的顺序增加。但此订单可能会在遇到访问说明符(private
,protected
,public
)的任何地方中断。这已在Inside the C++ Object Model Lippman 中详细讨论过。
不允许编译器执行此操作 但重新排列本身。该 标准要求所有数据都是 在相同 public:,protected:或 私人:必须在那里布置 由编译器订购。 如果你 通过访问来散布您的数据 但是,编译器是说明符 允许重新排列 access-specifier-delimited块 数据改善布局,即是 为什么有些人喜欢进入 每个数据前面的说明符 构件
有趣,不是吗?
答案 1 :(得分:3)
来自n3225
, 9.2 [class.mem] note 15
分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序未指定(11)。
这意味着给出以下声明:
class Foo {
public: int a;
private: int b;
public: int c;
private: int d;
};
标准仅强制执行以下断言:
Foo foo;
assert(&foo.a < &foo.c);
assert(&foo.b < &foo.d);
@ Nawaz的引用可以解释为给出4个可以自由混合的块,但事实并非如此。 Foo
的声明完全等同于:
class Foo' {
public: int a,c;
private: int b,d;
};
实际上,编译器完全忽略(为此目的)一个说明符是出现一次还是多次,并且每次指定它都是假的,并且最好因为额外的解析而减慢编译速度。对于人类读者来说,它可能更清楚......但这是非常主观的。