gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:56 25 4
gpt4 key购买 nike

我有一个类,我想重新组织它以避免填充我怎样才能做到这一点?我应该担心函数顺序吗?

类是:

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

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

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

 MyClass *fils[256];

代替

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

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

此外,在我的系统上空 std::string 的开销是 32 字节,所以取决于你在 etiquette 中保留的内容。您可能还想重新考虑这一点——例如,如果 etiquette在 MyClass 的不同实例中是重复的,您可能想找到一种方法来保留一组唯一的值,并且只是一个从 MyClass 到唯一的 etiquette 的指针。

YMMV.

关于c++ - 如何避免在 C++ 对象中填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com