Хранение каждого элемента класса контейнера как объекта - PullRequest
0 голосов
/ 15 апреля 2011

Недавно я видел несколько классов массивов Matrix и 1D, реализованных на C ++, где каждый отдельный элемент заключен в класс (например, класс 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

каковы могут быть последствия этого второго подхода, особенно если нам нужно использовать матрицу для большого объема данных? Кроме того, если нам нужно использовать этот тип при программировании на GPU (перевод в память устройства туда и обратно)?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011

Одним недостатком является стоимость памяти для каждого элемента, что может быть проблемой производительности в больших коллекциях. Это будет стоить вам как минимум байт, вероятно, больше для заполнения. Оператор "sizeof" должен сообщить вам стоимость.

0 голосов
/ 15 апреля 2011

Если у класса нет виртуальных функций, они, вероятно, будут * помещены в непрерывную память с чем-то вроде new Element[20] или std::vector<Element> v(20).Как отмечалось выше, std :: set и большинство других контейнеров STL не обязательно являются смежными.

* Я говорю «вероятно», потому что в зависимости от размера фактического типа компилятор может вставить некоторые отступы, которые вы можетевозможно, при необходимости используйте #pragmas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...