如何避免为未使用的属性分配内存

How to avoid allocating memory for unused attributes

本文关键字:属性 分配 内存 未使用 何避免      更新时间:2023-10-16

我有一个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.
}

我会尝试构造函数重载.构造函数可以以类似于函数重载的方式重载。

重载构造函数具有相同的名称(类的名称),但参数数量不同。

根据传递的参数的数量和类型,调用特定的构造函数。