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 ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

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

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

Ничего, это всё ещё одна из основных популярных осей.

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

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

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

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

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

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

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

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

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

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

AIv ★★★★★
()

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

Legioner ★★★★★
()

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

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

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

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

legolegs ★★★★★
()

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

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

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

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

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

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

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

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

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

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

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

Это как?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Deleted
()

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

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

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

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

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

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

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

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

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

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

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

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

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

Ну, толсто же

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AIv ★★★★★
()

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

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