gpt4 book ai didi

c++ - public 和 private 对对象的内存布局有影响吗?

转载 作者:IT老高 更新时间:2023-10-28 12:50:48 24 4
gpt4 key购买 nike

这是我另一个问题的后续:What is the optimal order of members in a class?

如果我以公共(public)、 protected 和私有(private)的方式轮流组织成员,它会改变任何东西(可见性除外)吗?

class Example
{
public:
SomeClass m_sc;
protected:
char m_ac[32];
SomeClass * m_scp;
private:
char * m_name;
public:
int m_i1;
int m_i2;
bool m_b1;
bool m_b2;
private:
bool m_b3;
};

这个类和我在运行时将所有成员公开的类之间有区别吗?我想遵循将类型从大到小排序的规则(如果不严重损害可读性)。

我假设它根本不会影响编译的程序,就像 const 只在编译期间检查。这是正确的吗?

最佳答案

答案取决于语言版本,因为它已从 C++03 更改为 C++11。

在 C++03 中,规则是:

Members within the same access control block (that is, from one of public, protected, private keywords to the next one from that set) are to be allocated in order of declaration within class, not necessarily contiguously.

在 C++11 中,规则改为:

Members with the same access control level (public, protected, private) are to be allocated in order of declaration within class, not necessarily contiguously.

所以在 C++03 中,你可以保证这一点(我使用 @ 来表示类中成员的偏移量):

  • @m_ac < @m_scp
  • @m_i1 < @m_i2 < @m_b1 < @m_b2

在 C++11 中,您还有一些保证:

  • @m_ac < @m_scp
  • @m_sc < @m_i1 < @m_i2 < @m_b1 < @m_b2
  • @m_name < @m_b3

在这两个版本中,编译器都可以根据需要对不同链中的成员重新排序,甚至可以交错链。


请注意,还有一种机制可以进入图片:标准布局类。

一个类是标准布局,如果它没有虚拟,如果它的所有非静态数据成员具有相同的访问控制,它没有基类或非标准布局类型或引用类型的非静态数据成员,并且如果它的继承链中最多有一个类具有任何非静态数据成员(即,它不能既定义自己的非静态数据成员又从基类继承一些)。

如果一个类是标准布局,还有一个额外的保证,即它的第一个非静态数据成员的地址与类对象本身的地址相同(这只是意味着填充不能出现在类布局)。

请注意,作为标准布局的条件,以及实际编译器不会做出悲观的选择,实际上意味着在标准布局类中,成员将按声明顺序连续排列(必要时穿插填充对齐) .

关于c++ - public 和 private 对对象的内存布局有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36149462/

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