在我正在处理的代码库中,它目前有经常这样做的代码:
// In the header:
class Label
{
public:
void ParseText();
private:
Letter* m_myArray;
};
// In the CPP:
void ParseText()
{
delete[] m_myArray;
m_myArray = new Letter[string_length];
// ......
}
基本上每次标签中的字符串发生变化时,我们都会删除旧的字母对象集并重新创建它们。这些字母对象有些轻量级,但由于这种情况经常发生,我不能简单地使用std::vector<Letter>
,因为每个对象push_back()
都会产生一个副本。我也想避免复制。
在这里使用提升池有帮助吗?我可以想象这样做(这是伪代码,因为我还不确定如何使用 boost pool):
// In the header:
class Label
{
public:
void ParseText();
private:
std::vector<Letter*> m_myArray;
boost::object_pool m_pool;
};
// In the CPP:
void ParseText()
{
// Loop through each element in m_myArray and call pool::free
m_myArray.clear();
// Loop each letter and create a new Letter object in the container
for( ... ) {
m_myArray.push_back(m_pool.malloc()); // Not sure how to handle constructor params
}
// ......
}
这将避免复制并避免如此频繁地进行分配。但是,我降低了代码的可维护性,因为从向量中添加/删除项目涉及太多样板。
我曾想过将 boost::ptr_vector 与自定义删除器一起使用,但不确定这是否有很大帮助。pool::malloc()
它有助于清理,但每次执行 push_back 时我仍然需要调用。
使用带有 std::vector 的自定义分配器似乎也没有意义,因为它无论如何都是预先分配的并且不会缩小大小。
谁能帮我找出解决这个问题的“最佳”解决方案?