LINUX.ORG.RU

[C++][поинтеры][солярис] дилемма выбора


0

1

Есть такая ситуация: Кроссплатформенная прожка на плюсах в которой появилась необходимость лукапа некого обьекта по поинтеру, например так:

std::map<CoreInterface const*, std::string> nameMapping;
Проблема в том, что использовать голые поинтеры не сильно хочется. Хочется скорее чего-то вродще shared_ptr<>. Но тут возникает вторая проблема: shared_ptr есть только в tr1, бусте и c++11. Проблемой это является потому, что прожку хотелось бы иметь кросплатформенной, то есть работающей на фряхе, солярисе, винде, линуксе и макоси. А вот солярис в дефолтной поставке не имеет ни tr1 ни c++11 (там вобще гцц 3.4.6) ни буста (которого впрочем нигде по-дефолту нету).

Собственно вопрос, как быть?

Пока видятся следующе варианты решения:

  • Использовать tr1 или c++11 и заставить солярщиков обновить гцц (не очень приятно, но жить можно)
  • Использовать буст и заставить вобще всех ставить себе буст ради возможности попользоваться моей прожкой (совсем неприятно, жить тоже так как-то не хочется)
  • Навелосипедиь свой shared_ptr, может быть на основе бустового (и разгребать потом проблемы с безопасностью, эксепшонами и многотредовостью)
  • Оставить голые поинтеры как есть (тоже не сахар, зато двигаться не надо совсем)

Ваши предложения?

таскать кусок буста вместе с исходниками. или требовать его от собирающего.

Deleted ()

А что, каждый пользователь вашей программы будет собирать её из исходников? Поставить на сборочные машинки буст, собираться там и раздавать готовый дистрибутив.

DELIRIUM ★★☆☆☆ ()

А ничего, что солярис RIP?

xorik ★★★★★ ()
Ответ на: комментарий от DELIRIUM

Да, в идеале хотелось бы иметь сорцы независимыми от конфигурации машины насколько это возможно в пределах разумного.

itakingiteasy ()
Ответ на: комментарий от itakingiteasy

Ну тогда я плюсую вариант с тасканием куска буста с собой.

DELIRIUM ★★☆☆☆ ()

Написать к этой проге shared_ptr самому ручками? Там же всего ничего...

AIv ★★★★★ ()
Ответ на: комментарий от AIv

Тогда такой вопрос: что из себя представляет shared_ptr<>? Просто обёртка поинтеру, которая:

  • Держит унутре обычный поинтер определённого типа
  • При копировании увеличивает внутренний счётчик копий
  • При удалении уменьшает внутренний счётчик копий
  • При достижении счётчиком значения 0 - вызывает delete к своему поинтеру

Это всё? Или я чего-то забыл?

itakingiteasy ()
Ответ на: комментарий от itakingiteasy

Вроде все. Только счетчик копий общий одного для объекта (лежит отдельно в куче). Да гляньте исходники того же буста...

AIv ★★★★★ ()
Ответ на: комментарий от itakingiteasy

Или напр. Джеф Элджер, «С++ для профессионалов» (как то так, в сети есть) - именно этот вопрос там раскрыт;-).

AIv ★★★★★ ()

Просто поставь буст в зависимости и всё. Зачем его так бояться то? Ну если есть много свободного времени, можно и переписать его часть.

Legioner ★★★★★ ()
Ответ на: комментарий от AIv

Спасибо большое, похоже

template<typename T> class shared_ptr { size_t *counter; T *t; };

это просто идеальный вариант.

itakingiteasy ()
Ответ на: комментарий от Legioner

Да, время есть, а первобытный страх перед крупными монстрами вроде кутей и буста силён как никогда %)

itakingiteasy ()

>заставить солярщиков обновить гцц

Тащемта лучший вариант. А то так и будешь сидеть в болоте, увязая всё глубже.

разгребать потом проблемы с ... многотредовостью

Для протокола: shared_ptr не тредобезопасный.

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

Заставить поставить буст гораздо проще чем заставить обновить gcc.

Reset ★★★★★ ()

Вот shared_ptr - http://ifolder.ru/25549216 Без многопоточности и оператора <(если вы хотите его юзать в качестве ключа), думаю недостающее сами допишите без проблем.

Booster ★★ ()
Ответ на: комментарий от itakingiteasy

Использовать shared_ptr в качестве ключа не совсем здравая мысль, ввиду того что они шарят указатели и с уникальностью не очень.

Booster ★★ ()
Ответ на: комментарий от Reset

Только какой именно буст? На старый-то gcc? Ну и я не сказал «проще», я сказал «лучше» ;)

legolegs ★★★★★ ()
Ответ на: комментарий от legolegs

> Для протокола: shared_ptr не тредобезопасный.

Что в данном случае понимается под «потокобезопасностью»? Манипуляции счетчиком ссылок потокобезопасны, а больше ничего в shared_ptr и нет.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

>Манипуляции счетчиком ссылок потокобезопасны, а больше ничего в shared_ptr и нет.

Это как? Они же шарят общий счётчик. Его как раз и нужно защищать.

Booster ★★ ()
Ответ на: комментарий от Booster

>>Манипуляции счетчиком ссылок потокобезопасны, а больше ничего в shared_ptr и нет.

Это как?

Что именн непонятно?

Они же шарят общий счётчик. Его как раз и нужно защищать.

Его и защищают.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Вы написали что манипуляции со счётчиком потокобезопасны, отсюда можно сделать вывод что его не надо защищать.

Booster ★★ ()
Ответ на: комментарий от Booster

> Вы написали что манипуляции со счётчиком потокобезопасны

Они потокобезопасны именно потому, что приняты специальные меры.

отсюда можно сделать вывод что его не надо защищать.

Только при желании.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

>Они потокобезопасны именно потому, что приняты специальные меры.

Значит я просто не понял.

Booster ★★ ()
Ответ на: комментарий от xorik

>А ничего, что солярис RIP?

Кто сказал RIP? 11 express вышел уже при Ораклыче

annulen ★★★★★ ()
Ответ на: комментарий от xorik

RIP - только OpenSolaris. Обычный закрытый солярис еще жив.

Deleted ()
Ответ на: комментарий от AIv

Конечно, вариант, но нужно ли пилить велосипед, если это уже 1000000 раз реализовано?

Deleted ()
Ответ на: комментарий от itakingiteasy

Нет в бусте ничего монструозного, лежит он там и пусть лежит, а shared_ptr там нормальный и программу на гигабайт тяжелее не сделает.

Legioner ★★★★★ ()
Ответ на: комментарий от itakingiteasy

> Да, время есть, а первобытный страх перед крупными монстрами вроде кутей и буста силён как никогда %)

Я тут недавно тоже буста боялся, но оказалось, что для использования большей части достаточно только включить заголовочные файлы.

note173 ★★★★★ ()
Ответ на: комментарий от itakingiteasy

Ну так в данном случае нужен только маленький, красивый кусочек буста, а не весь буст.

Deleted ()

Сделать свой враппер, который будет прикидываться разными бустами, птрами и проч. в зависимости от ситуации.

anonymous ()
Ответ на: комментарий от anonymous

Ну это вообще бред. Уж лучше и правда скопипастить куски буста в проект, на манер sqlite amalgamation, чем делать прослойку-велосипед.

legolegs ★★★★★ ()
Ответ на: комментарий от Deleted

> нужно ли пилить велосипед,

Вы так говорите, как будто там есть что пилить. Мы дольше спорить будем, чем у ТС-а времени уйдет что бы это сделать.

AIv ★★★★★ ()
Ответ на: комментарий от AIv

Да на любое, самое длинное и сложное решение проблеммы у ТСа ушло бы времени больше, чем на создание топика на ЛОРе и ожидание первого ответа. От его поста до первого ответа - окло 13 минут, запилить свой shared_ptr - минут 10, заюзать буст - несколько секунд.

Deleted ()
Ответ на: комментарий от Deleted

> запилить свой shared_ptr - минут 10

Песец, не думал, что плюсатые - такие конченые велосипедостроители.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Чего это они велосипедостроители?

PS. Я вообще-то предлагал не строить велосипед, а таки заюзать буст.

Deleted ()
Ответ на: комментарий от tailgunner

> плюсатые - такие конченые велосипедостроители.

Ну, толсто же, товарищ прапорщик.

LamerOk ★★★★★ ()
Ответ на: комментарий от LamerOk

>> плюсатые - такие конченые велосипедостроители.

Ну, толсто же

Чо «толсто», ты посчитай, сколько предложений написать shared_ptr самому или написать враппер самому же.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

> ты посчитай, сколько предложений

А еще я посчитал, сколько предложений «ставить буст», который почти полностью хедер-онли.

Ты, конечно, довёл градус дискусси до финишной черты, но уж очень толсто. )))

LamerOk ★★★★★ ()
Ответ на: комментарий от legolegs

> Только какой именно буст? На старый-то gcc?

boost::shared_ptr компилится даже Borland C++ 5.

k_andy ★★★ ()
Ответ на: комментарий от itakingiteasy

Подумаешь shared_ptr... у меня вон потоки (файловые) свои, и чего теперь? ;-)

AIv ★★★★★ ()
Ответ на: комментарий от AIv

Я в том смысле,что иногда и велосипедостроение весьма оправдано. ИМНО делать надо так, как удобно... а не так что бы ЛОР-овские аналитики были довольны;-)

AIv ★★★★★ ()
Ответ на: комментарий от AIv

> у меня вон потоки (файловые) свои, и чего теперь? ;-)

Ну покрасней хотя бы.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

> Песец, не думал, что плюсатые - такие конченые велосипедостроители.

толсто же, у человека очень специфичная ситуация и ему предложили один вариант из нескольких, в «нормальных условиях» определенно стоит использовать лишь только один вариант - стандартный shared_ptr, который есть в gcc/msvc/clang etc.

aho ()
Ответ на: комментарий от tailgunner

Зачем? У меня были достаточно веские причины их сделать.

AIv ★★★★★ ()

Зачем «ставить» буст для возможности пользования прогой? smart_ptr - header only либа.

ratatosk ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.