我有一堂课,我想对它进行重组以避免padding我该怎么做?我应该担心功能顺序吗?
该类是:
class MyClass
{
private:
std::vector<std::pair<char,MyClass>> fils;
std::string etiquette = "";
unsigned int frequence = 0;
void privateFunction1();
void privateFunction2();
void privateFunction3();
public:
MyClass();
void publicFunction1();
void publicFunction2();
void publicFunction3();
};
如评论中已经提到的,功能和功能顺序对于大小并不重要。
MyClass结构本身(或至少在32位系统上至少没有,但是您没有提及cpu体系结构)中实际上应该没有任何填充,但是std :: vector和std :: string的内容分配在类的实际结构。
如您在此答案中所见,向量的内容是在向向量中添加数据时分配的连续内存中,除非您设置容量,否则可能会产生很多开销-因此capacity()
std :: vector的MyClass中的数据可能会增加额外的开销。
消除填充可以为您节省任何内容的唯一结构是std::pair<char, MyClass>
..您没有说出std :: vector中有多少个元素,但是如果每个可能的char几乎有一个(即256个),并且由于您担心总的内存消耗,因此最好使用
MyClass *fils[256];
代替
std:vector< std:pair<char, MyClass> > fils
因为您不再需要管理向量的容量来获取确切的空间,并且填充时与std :: pair的开销几乎相同。
另外,我的系统上空的std :: string的开销为32个字节,因此,根据所保存的内容,etiquette
您可能还需要重新考虑-例如,如果etiquette
在MyClass的不同实例中重复了,则可能想要找到一种方法来保留一组唯一的值,而只是一个从MyClass指向唯一值的指针etiquette
YMMV。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句