【问题标题】:Which is the Best C++ Container to use哪个是最好的 C++ 容器
【发布时间】:2015-07-28 16:03:44
【问题描述】:

我正在使用 c++03,并试图找出要使用的容器。硬件是 MSP430F5324,总共有 6k 的 RAM(我只有 5k 可用)和 64k 闪存。我正在尝试存储派生类的组合,例如:

class OptNode {
 public:
    virtual ~OptNode();
    explicit OptNode(uint16_t option_no) : option(option_no), _next(0) {}
 protected:
    uint16_t option;
    unsigned length;
};

// --- Use heap memory for the option
class OptNodeDynamic : public OptNode {
 public:
    // --- assignment operators and copy constructor are not defined
    OptNodeDynamic(const OptNodeDynamic &cSource);
    OptNodeDynamic& operator= (const OptNodeDynamic &cSource);

    OptNodeDynamic(uint16_t option_no, uint8_t* option_data, size_t length);
    ~OptNodeDynamic();
 private:
    uint8_t* data;
};

// --- Use the c string for the option
class OptNodeCstr : public OptNode {
 public:
    OptNodeCstr(uint16_t option_no, const char* option_data);
 private:
    const char* data;
};

// ----- OptNodeDynamic() ------------------------------------------------------
OptNodeDynamic::OptNodeDynamic(uint16_t option_no,
                                     uint8_t* option_data,
                                     size_t length) : OptNode(option_no) {
    //
    option = option_no;
    data = new uint8_t[length];
    std::memcpy(data, option_data, length);
}

// ----- ~OptNodeDynamic() -----------------------------------------------------
OptNodeDynamic::~OptNodeDynamic() {
    if (data != 0 && length != 0) {
        delete data;
    }
}

// ----- OptNodeCstr() ---------------------------------------------------------
OptNodeCstr::OptNodeCstr(uint16_t option_no,
                               const char* option_data)
                  : OptNode(option_no),
                    data(option_data) {
    //
    length = 0;
    for (const char* itr_ptr = data; *itr_ptr != '\0'; ++itr_ptr, ++length) {
        /* no code */
    }
    return;
}

容器应该只为每个对象分配它需要的东西。我应该能够以任意顺序添加类型 B 或 C 的对象,并且可以根据需要添加任意数量的对象。有这样的容器吗?还是我使用new 运算符实例化每个对象并将指针传递给容器,例如列表。

编辑:我添加了硬件描述并将类从示例更改为实际。我认为系统在数据上传过程中需要 0 到 8 个实例,这个过程最多每小时发生一次。其他时候,我可以将堆内存用于其他用途。

【问题讨论】:

  • 只有 5k 的内存可供您使用,您应该从与一般容器不同的方向思考。您没有空间容纳标准容器所依赖的运行时库。 IE。你根本不能使用标准容器,除了std::array。例如。将 B 和 C 实例放在单独的数组中。这可以产生简单的代码和高效的索引。
  • 这种容器的目的到底是什么?只是为了容纳一排元素?它应该是多态的吗?它应该以某种方式排列它们吗?你的问题很模糊..
  • 有了 5k ram,恕我直言,c++ 动态内存管理根本没有空间。我会坚持好的老c..
  • 关于“new operator”,您没有动态分配机制的空间,抱歉。如果您的意思是“new 表达式”,那么这就是不一定涉及动态分配的其他内容。但我认为除了动态分配之外,您不太可能想到其他任何东西,因为那样您就已经写了。
  • 您需要提供有关您的执行环境的更多详细信息,您将如何使用这些对象以及它们的数量。尝试显示实际代表您实际使用的类的类。您的系统是否有 5K 的总内存(正如某些人所假设的那样),或者您是否还有一个单独的更大的程序(闪存)内存?您的目标 CPU 是什么?

标签: c++


【解决方案1】:

无。

您的平台上没有足够的内存用于 C++ 运行时库。您不应该也不能使用任何 C++ 容器。

坦率地说,我会为此坚持使用好的 ol' C。至于你实际编写什么代码来实现你的目标,这取决于你的目标。 :)

【讨论】:

    【解决方案2】:

    使用 new 分配单个对象时会产生很大的开销(每次调用 new 最多十分之几字节)。

    如果要节省内存,最好的办法是预先分配三块内存(池)用于存储 A、B 和 C 的实例,并为 A、B 和 C 重载 new 和 delete 运算符C.

    您将在以下问题的答案中找到示例:

    Using operator new and operator delete with a custom memory pool/allocator

    【讨论】:

      【解决方案3】:

      在初始化时预分配所有对象,然后尝试在整个进程的生命周期中使用指针会更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 2011-07-24
        • 2010-09-20
        • 1970-01-01
        • 2011-01-15
        • 2017-09-25
        • 2013-07-18
        • 2011-05-29
        相关资源
        最近更新 更多