【发布时间】: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..
-
关于“
newoperator”,您没有动态分配机制的空间,抱歉。如果您的意思是“new表达式”,那么这就是不一定涉及动态分配的其他内容。但我认为除了动态分配之外,您不太可能想到其他任何东西,因为那样您就已经写了。 -
您需要提供有关您的执行环境的更多详细信息,您将如何使用这些对象以及它们的数量。尝试显示实际代表您实际使用的类的类。您的系统是否有 5K 的总内存(正如某些人所假设的那样),或者您是否还有一个单独的更大的程序(闪存)内存?您的目标 CPU 是什么?
标签: c++