如何避免C ++对象中的填充?

时间:2016-07-17 23:15:55

标签: c++ class optimization memory-management 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();
};

1 个答案:

答案 0 :(得分:4)

正如评论中已经提到的,函数的函数和顺序对于大小并不重要。

在MyClass结构本身中确实不应该有任何填充(或者至少不是在32位系统上,但是你没有提到cpu架构),但是std :: vector和std :: string的内容是在班级的实际结构之外分配。

正如您在this answer中所看到的那样,当您将数据添加到向量中时,向量的内容在分配的连续内存中,除非您设置容量,否则可能会有很多开销 - 所以<{1}} MyClass中的std :: vector数据可能会增加额外的开销。

唯一可以省去填充的结构可以保存在capacity()中..你没有说明你在std :: vector中有多少元素,但是如果几乎每一个都有可能的char(即差不多256),既然你担心总内存消耗,那么你可能最好使用

std::pair<char, MyClass>

而不是

 MyClass *fils[256];

因为您不再需要管理向量的容量以获得确切的空间,并且在填充时与std ::对的开销大致相同。

此外,我系统上空std :: string的开销是32字节,因此根据您在 std:vector< std:pair<char, MyClass> > fils 中保留的内容,您可能也想重新考虑这一点 - 例如{{} 1}}在MyClass的不同实例中,你可能希望找到一种方法来保存一组唯一的值,只需一个指向MyClass的指针到唯一的etiquette

因人而异。