【发布时间】:2016-07-17 23:15:55
【问题描述】:
我有一个类,我想重新组织它以避免填充 我怎样才能做到这一点? 我应该担心函数顺序吗?
班级是:
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();
};
【问题讨论】:
-
为什么要避免填充?填充是一种特性,而不是敌人。
-
除非您的目标是内存紧张的嵌入式系统(内存以几千字节为单位),否则我建议您不要打扰。填充可以使结构在内存中更好地对齐,从而可能导致更快的访问时间。
-
你可以通过不同的方式打包结构来改变对齐和填充(当然也可以通过重新排列成员变量)。如何做到这一点取决于您使用的编译器。这可能会为您的课程节省几个字节,但它不会是“递归的”。
std::vector和std::string类中的填充不会改变。 -
另外,
fils元素真的应该是一对字符和类的 instance 吗?这会复制整个对象。也许您应该改用指针?这可能会为您节省很多,具体取决于您的用例或课程。可能比尝试打包课程更好。 -
成员函数在对象中不占用空间(除非它们是
virtual),因此重新排序它们并不重要,只有变量。使用使用sizeof打印不同变体大小的测试程序。对于打包,如果您告诉编译器打包MyClass结构,那么只会打包该结构。反过来结构的成员变量将不会被打包。因此,您可以在fils、etiquette和frequence之间节省几个字节的填充,仅此而已。std::vector和std::string结构不会被打包。
标签: c++ class optimization memory-management padding