班级成员的最佳顺序是什么?

Fab*_*ian 9 c++ optimization

如果我有以下课程:

class Example
{
  bool m_b1;
  SomeClass m_sc;  
  bool m_b2;
  char * m_name;
  bool m_b3;
  int m_i1;
  SomeClass * m_sc;
  int m_i2;
};
Run Code Online (Sandbox Code Playgroud)

会员的最佳顺序是什么?据我所知,在创建此类的实例时,成员声明的顺序等于内存中成员的顺序.

  • 我应该对成员进行排序,以便相同的类型在一起吗?
  • 所有指针都算作同一类型吗?
  • 重新排列是否会影响对象的大小?4或8字节对齐是否适用于此处?
  • 我怎么能看到上面的效果?sizeof是否显示对象使用的内存,包括用于对齐的空白空间?
  • 是否最好在一天结束时对成员进行排序,以便更容易理解其含义和背景?

小智 8

当使用初始化列表时成员变量依赖于另一个成员变量时,顺序很重要:

想象一个带有两个变量的类,其中第二个变量(varC)的构造函数需要第一个变量(varB)

class A
{
    B varB;
    C varC;

    A()
    : varC(varB)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

顺序决定构造函数执行的步骤,因此更改varB和varC的顺序会将varB的未初始化对象传递给varC.

当然,风格和可读性也很重要.


bol*_*lov 7

根据经验,您应该按尺寸排序,从大到小.这将创建结构的最小填充,从而最小化结构尺寸.如果结构的对象在连续分配的内存中使用,例如向量,并且对缓存有很多帮助(更多对象适合同一缓存行),这就最为重要.

Andrei Alexandrescu(我认为是在CppCon中的一个)证明了另一个惊人的优化是他带来了访问量最大的成员.这更快,因为偏移为零.当然,在对应用程序进行基准测试并关注每一小段性能之后,他正在谈论微优化.