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

时间:2017-10-19 07:23:56

标签: c++ class memory

我有一个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对象,设置其名称和密码并将其转发给另一个类。现在剩下的属性都是空的并且未使用但仍占用内存。

我该如何解决这个问题?

更新 在这种情况下,访客模式是否会帮助我,我不确定是否会针对此类问题。

4 个答案:

答案 0 :(得分:6)

由于Basile的答案在全球意义上是正确的,我认为重要的是陈述以下内容。

如果您尝试实施通信协议,我建议您使用常用的数据序列化库。

这些库允许您轻松声明通信协议,它们包括对此类功能的支持等,并且受到许多不同语言的支持。

可以找到完整的选项列表here

我过去成功使用过这些:

答案 1 :(得分:3)

了解tagged union和类型。了解如何使用union types,特别是关注rule of five和/或使用std::variant。也许您需要placement new显式调用析构函数。首选smart pointers(另请参阅this)至原始版本(以及std::stringchar*)。使用enum s(甚至enum class es)代替有界ID。熟悉containers

你也可以尝试定义一些类层次结构,以便有几类消息......

在编码前花一周时间阅读一些好的book on C++ programming

答案 2 :(得分:3)

您可以利用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
};

创建消息对象 - 您可以实现一个帮助创建不同messageType对象的工厂

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.
}

答案 3 :(得分:0)

我会尝试使用Constructor Overloading.Constructor可以像函数重载一样重载。

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

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