如何避免在 C++ 对象中填充?
How to avoid padding in a C++ object?
我有一个 class 我想重新组织它以避免填充
我怎样才能做到这一点?
我应该担心函数顺序吗?
class 是:
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 分配在 class 的实际结构之外。
正如您在 this answer 中看到的那样,向量的内容在您向向量中添加数据时分配的连续内存中,除非您设置容量,否则可能会有很多开销 --因此 MyClass 中 std::vector 数据的 capacity()
可能会增加额外的开销。
消除填充可以为您节省任何东西的唯一结构是 std::pair<char, MyClass>
..您没有说 std::vector 中有多少元素,但如果几乎每个可能的字符一个(即几乎 256),并且由于您担心总内存消耗,那么您最好使用 a
MyClass *fils[256];
而不是
std:vector< std:pair<char, MyClass> > fils
因为您不再需要管理向量的容量来获得准确的 space,并且在填充时您的开销与 std::pair 大致相同。
此外,在我的系统上空 std::string 的开销是 32 字节,因此根据您在 etiquette
中保留的内容,您可能还需要重新考虑——例如,如果MyClass 的不同实例中的 etiquette
是重复的,您可能想找到一种方法来保留一组唯一的值,并且只是从 MyClass 到唯一的 etiquette
的指针
YMMV.
我有一个 class 我想重新组织它以避免填充 我怎样才能做到这一点? 我应该担心函数顺序吗?
class 是:
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 分配在 class 的实际结构之外。
正如您在 this answer 中看到的那样,向量的内容在您向向量中添加数据时分配的连续内存中,除非您设置容量,否则可能会有很多开销 --因此 MyClass 中 std::vector 数据的 capacity()
可能会增加额外的开销。
消除填充可以为您节省任何东西的唯一结构是 std::pair<char, MyClass>
..您没有说 std::vector 中有多少元素,但如果几乎每个可能的字符一个(即几乎 256),并且由于您担心总内存消耗,那么您最好使用 a
MyClass *fils[256];
而不是
std:vector< std:pair<char, MyClass> > fils
因为您不再需要管理向量的容量来获得准确的 space,并且在填充时您的开销与 std::pair 大致相同。
此外,在我的系统上空 std::string 的开销是 32 字节,因此根据您在 etiquette
中保留的内容,您可能还需要重新考虑——例如,如果MyClass 的不同实例中的 etiquette
是重复的,您可能想找到一种方法来保留一组唯一的值,并且只是从 MyClass 到唯一的 etiquette
YMMV.