Если объекты не относятся друг к другу, может потребоваться ручной подсчет ссылок. Было бы больше затрат при добавлении или удалении из списка, но не накладных расходов на фактический доступ к объекту. (Это может быть болезненно для диагностики, когда вы ошибаетесь, поэтому я рекомендую быть осторожным, чтобы понять это.)
Если есть время между операциями, подумайте о сборе мусора. Ведение списка всех объектов (вероятно, будет назойливый список). Когда у вас есть время сэкономить, перекрестные ссылки на другие списки; любые объекты, не входящие в список, могут быть удалены. Для этого вам не нужен дополнительный массив (только глобальный счетчик и счетчик последнего просмотра для каждого объекта), поэтому он может быть достаточно эффективным.
Другим вариантом является использование интеллектуального указателя, обеспечивающего доступ к основному указателю. Если вы пытаетесь избежать накладных расходов, вызвав перегруженный operator->
, то это может стоить попробовать. Храните интеллектуальные указатели в списках (для этого используется управление жизненным циклом), а затем при запуске объектов вы можете получить необработанный указатель для каждого и работать с ним (чтобы вы не наносили накладные расходы на все перегруженные operator->
и т. Д.). Например:
std::vector<smart_ptr<T> > objects;
if(!objects.empty()) {
smart_ptr<T> *objects_raw=&objects[0];
for(size_t n=objects.size(),i=0;i<n;++i) {
T *object=objects_raw[i].get_ptr();
// do stuff
}
}
Это такой подход, который я предпочитаю лично.Долгосрочное хранение получает умный указатель, кратковременное хранение получает простой указатель. Время жизни объекта прост в управлении, и вы не сваливаете 100 000 крошечных накладных расходов (что более важно для того, чтобы сохранить отладочную сборку, но она может легко добавить впустую время).
Попробуйте умный указатель. Профиль, чтобы проверить, имеет ли он слишком большое влияние. Скорее всего, это будет не слишком много, и это, вероятно, будет меньше, чем большинство решений для вашего собственного решения. – sje397 2010-11-23 10:25:33
К сожалению, вы не можете многое сделать. Вам необходимо определить обязанности, то есть кто несет ответственность за владение вашими ресурсами. Это, на мой взгляд, фундаментальная проблема с C++ и, вероятно, одна из самых больших причин, по которой люди переходят на другие языки. – 2010-11-23 10:27:49
Вы * профилировали * умный указатель или это только ваша догадка? – Simone 2010-11-23 10:28:27