集群成员变量声明的类型是否有用?

请看下面的代码示例,它使用Visual Studio 2010在Windows-32系统上执行:

#include <iostream>

using namespace std;

class LogicallyClustered
{
    bool _fA;
    int _nA;
    char _cA;

    bool _fB;
    int _nB;
    char _cB;
};

class TypeClustered
{
    bool _fA;
    bool _fB;

    char _cA;
    char _cB;

    int _nA;
    int _nB;
};

int main(int argc, char* argv[])
{
    cout << sizeof(LogicallyClustered) << endl; // 20
    cout << sizeof(TypeClustered) << endl; // 12

    return 0;
}

问题1

这两个类的sizeof有所不同,因为编译器正在插入填充字节以实现优化的变量内存分配。 它是否正确?

问题2

为什么如果按照class TypeClustered的类型对变量进行聚类,内存占用会更小?

问题3

总是根据类型对成员变量进行聚类是否是一个很好的经验法则? 我是否也应根据其大小升序对它们进行排序(bool,char,int,double ...)?

编辑

附加问题4

较小的内存占用空间将提高数据高速缓存的效率,因为可以缓存更多的对象,并避免对“慢速”RAM进行完全内存访问。 那么成员声明的排序和分组可以被认为是(小),但容易实现性能优化?


1)绝对正确。

2)它不是更小,因为它们被分组,但是因为它们被排序和分组的方式 。 例如,如果您先后声明4个chars ,则它们可以打包为4个字节。 如果你声明一个char并立即一个int ,那么将插入3个填充字节,因为int需要对齐到4个字节。

3)不! 您应该将班级中的成员分组,以便班级变得更具可读性。

重要提示:这是所有平台/编译器特定的。 不要把它放在广告文字中。

另一个注意事项 - 在某些平台上,访问位于类实例的前n (变化)字节中的成员的性能也有所提高。 因此,在课程开始时声明经常访问的成员可能会导致速度的小幅增加。 但是,这也不应该成为一个标准。 我只是陈述一个事实,但绝不建议你这样做。


你是对的,大小不同,因为编译器在类LogicallyClustered中插入填充字节。 编译器应该使用像这样的内存布局:

class LogicallyClustered 
{ 
    // class starts well aligned
    bool _fA;
    // 3 bytes padding (int needs to be aligned)
    int _nA; 
    char _cA; 

    bool _fB; 
    // 2 bytes padding (int needs to be aligned)
    int _nB; 
    char _cB; 
    // 3 bytes padding (so next class object in an array would be aligned)
}; 

您的class TypeClustered不需要任何填充字节,因为所有元素都是对齐的。 bool和char不需要对齐,int需要在4字节边界上对齐。

关于问题3,我会说(经常:-))“这取决于”。 如果你处于内存占用不重要的环境中,我宁愿按逻辑顺序排序以使代码更具可读性。 如果您处于每个字节计数的环境中,您可能会考虑在成员间移动以优化空间使用。


除非没有严重的内存占用情况限制,否则将它们逻辑集群化,这可以提高代码的可读性并易于维护。

链接地址: http://www.djcxy.com/p/29807.html

上一篇: Cluster member variables declaration by their type useful or not?

下一篇: Is variable declaration within a loop bad?