如何避免在C++对象中填充

How to avoid padding in a C++ object?

本文关键字:填充 对象 C++ 何避免      更新时间:2023-10-16

我有一个类,我想重新组织它以避免填充我该怎么做?我担心函数顺序吗?

该类是:

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 的内容是在类的实际结构之外分配的。

正如您在此答案中看到的那样,向量的内容在将数据添加到向量时分配的连续内存中,除非您设置容量,否则可能会产生大量开销 - 因此 MyClass 中 std::vector 数据的capacity()可能会增加额外的开销。

消除填充可以为您节省任何东西的唯一结构是在std::pair<char, MyClass>中......您并没有说您在 std::vector 中有多少元素,但如果几乎每个可能的字符都有一个(即几乎 256),并且由于您担心总内存消耗,那么最好使用

 MyClass *fils[256];

而不是

 std:vector< std:pair<char, MyClass> > fils

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

此外,在我的系统上,空 std::string 的开销是 32 字节,因此根据您保留的内容etiquette您可能还需要重新考虑这一点——例如,如果 MyClass 不同实例中的etiquette重复,您可能希望找到一种方法来保留一组唯一的值,并且只是从 MyClass 到唯一etiquette的指针

扬子晚报.