集群成员变量声明的类型是否有用?
请看下面的代码示例,它使用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?