如何避免在C++对象中填充
How to avoid padding in a C++ object?
我有一个类,我想重新组织它以避免填充我该怎么做?我担心函数顺序吗?
该类是:
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
的指针
扬子晚报.
相关文章:
- 使用动态实例化的对象填充矢量的快速方法
- C++ - 对象填充的复杂性
- 哪些值存储在对齐的结构/类对象的填充字节中
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 在运行时 c++ 更改用类对象填充的数组的大小
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- 如何在文本文件中逐行读取并填充指向对象数组的指针
- 填充不同对象的矢量
- C++填充一个std::map创建不必要的对象
- 提升:创建对象并用线程填充矢量
- 使用相同的数据填充数组对象或使用指针
- 填充对象的C++二维数组
- 从文件填充对象的向量
- 如何在创建后正确填充对象而不修改类声明
- C++编译器内存填充:对象是否应该具有相同的大小
- C++ 使用用户输入填充对象向量
- 如何在c++中填充对象指针数组
- Cairo:重新填充对象(圆)并删除它
- 用于动态填充对象并在返回时销毁的c++习语
- 在循环中填充C++对象字段会导致空字段