将容器类的每个元素存储为对象

时间:2011-04-15 13:12:54

标签: c++ memory-management containers

最近,我看到在C ++中实现了一些Matrix和1D数组类,其中每个单独的元素都被包装为一个类(例如Element类)。通常,我们喜欢像Matrix这样的容器在内存中包含连续的实际元素(例如int)。对单个元素使用自定义类可以为您提供一些灵活性但可能的缺点是什么? 要简短,请参阅伪代码:

// 1st approach: Elements stored in their type.
template <class T>
class Matrix 
{
    T *m_data;
    //..
};

// 2nd approach: Elements wrapped into a class
template<class T>
class Matrix
{
    std::set<Element<T> > m_data; // or using std::vector<Element<T> > m_data
    //..
}; // Element is a class representing single element of type T

第二种方法可能会产生什么影响,特别是如果我们需要使用Matrix来处理大量数据?另外,如果我们需要在GPU编程中使用这种类型(来回转移到设备内存)?

2 个答案:

答案 0 :(得分:0)

如果该类没有虚函数,它们可能会被置于new Element[20]std::vector<Element> v(20)之类的连续内存中。如上所述,std :: set和大多数其他STL容器不一定是连续的。

*我说“可能”因为根据实际类型的大小,编译器可能会插入一些填充,您可以根据需要使用#pragmas控制它。

答案 1 :(得分:0)

一个缺点是每个元素的内存成本,这可能是大型集合中的性能问题。这将花费你至少一个字节,可能更多的填充。 “sizeof”运算符应告诉您成本。