如何避免为未使用的属性分配内存
How to avoid allocating memory for unused attributes
我有一个Message
类,其中包含消息可以具有的所有可能元素:
class Message {
int msg_id;
int msg_length;
char *username;
char *password;
char *usr_list;
char *to;
char *from;
char *grp_name;
int digit_1;
int digit_2;
char *msg;
};
但是不同的消息类型具有不同的正文元素,从中创建一个对象会浪费大量内存。例如,我的程序接收以下数据:
Msg -> (1, name, password)
当程序读取1
时,它会创建一个Message
对象,设置其名称和密码并将其转发到另一个类。现在,其余属性为空且未使用,但仍会占用内存。
我该如何解决这个问题?
更新:在这种情况下,访客模式会对我有所帮助吗,我不确定是否针对此类问题。
由于Basile的答案在全球范围内是正确的,我认为陈述以下内容很重要。
如果您尝试实现通信协议,我建议您使用常用的数据序列化库。
这些库允许您轻松声明通信协议,它们包括对此类功能等的支持,并且受到许多不同语言的支持。
可以在此处找到完整的选项列表。
我过去曾成功使用这些:
- 谷歌的协议缓冲区
- 谷歌的平面缓冲区
阅读有关标记并集或总和类型的信息。了解如何使用联合类型,特别是遵循五规则和/或使用 std::variant。也许您需要使用显式调用析构函数的新放置。更喜欢智能指针(另请参阅此处)而不是原始指针(std::string
指向char*
)。使用 enum
s(甚至 enum class
es)而不是有界 id。熟悉容器。
您还可以尝试定义一些类层次结构,以便拥有几类消息...
在编码之前,花一周时间阅读一些关于C++编程的好书。
您可以利用C++的继承和多态性。
根据不同的消息类型的属性对其进行分类,并创建类层次结构来表示它们。
class Message
{
public:
// virtual methods to process the message
private:
// Attributes common to all the messages
};
class MessageType1: public Message
{
public:
// Methods to process the message
private:
//Attributes specific to Type1 messages
};
class MessageType2: public Message
{
public:
// Methods to process the message
private:
//Attributes specific to Type2 messages
};
创建消息对象 - 您可以实现一个工厂来帮助创建不同的消息类型对象
class MessageFactory
{
// Method to create MessageType1 object
// Method to create MessageType2 object
};
存储消息对象 - 您可以使用容器通过标准库 API 存储和循环访问不同的消息对象。
std::vector<Message*> msgVect; // Can hold the derived class object pointers
处理消息 - 可以使用单个循环对所有存储的对象执行操作。
for (auto msg: msgVect)
{
// msg is pointer to the derived class objects stored earlier.
// You can invoke a method here to perform operations on the
// object.
}
我会尝试构造函数重载.构造函数可以以类似于函数重载的方式重载。
重载构造函数具有相同的名称(类的名称),但参数数量不同。
根据传递的参数的数量和类型,调用特定的构造函数。
- 将数组的地址分配给变量并删除
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 如何通过一个循环将多个文件的内容分配给不同的类属性?
- 属性分配无效:"displayText"是文本字段 qml 中的只读属性
- 动态分配的属性和继承
- 使用 switch 语句将不同的函数作为类属性分配 C++
- 从多属性<< C,B> 分配变体A,B,C>?
- 分配以下对象属性在哪里
- 将成员函数分配给实例成员的属性
- 使用 QAbstractListModel 分配 QML 布尔属性失败
- QML 无法分配给不存在的属性
- 在运行时分配已发布属性的确切时间?
- 为什么我不能分配此QT属性
- boost :: Spirit属性分配:struct is_nullary:基本类型无法成为结构或类型
- 如何避免为未使用的属性分配内存
- c++中对象属性的内存分配
- Qt - 无法分配给不存在的属性(自定义C++类)
- QML 无法将分配shared_ptr分配给<Track> [未知属性类型]
- 如何使具有常量属性的类可分配
- GLSL 3.30之前的属性分配