LINUX.ORG.RU

Почему void* не нужен?

 , ,


0

2

Смеркалось.

Пятница.

Можете считать что я накидываю, но душа моя лешит к си, а все плюсовики говорят, что сабж – это плохо. А я не понимаю: ну не размахивай рукой, гогда у тебя в руке нож, взял, отрезал, положил нож на место.

Что можно сделать плохого? Явно привести ни к тому типу? Ну так и в плюсах можно. Разименовать нулевой? См. предыдущий пункт.

Что еще?

★★★★★

void* в сишке плох не тем, что он существует, а тем, что его используют потому что ему нет нормальных альтернатив.

Сам по себе void* нужен и в плюсах, но в очень ограниченном кол-ве ситуаций. Его нужно использовать только в том случае, если сама задача требует избавиться от типа. Именно задача, а не доступные инструменты. Например он пригодится когда тебе надо поработать с куском памяти именно как с куском памяти, а не с содержимым этого куска.

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

Собственно в плюсах есть все инструменты, чтобы пользоваться void* только в тех случаях, когда этого требует задача. Потому в плюсах void* не нужен (за крайне редкими исключениями для библиотекарей). А в сишке есть только void*, а альтернативой может быть только дрисня на макросах, которая как правило ещё хуже.

Если брать твою аналогию с ножом, то к тому, что ты взял нож и нарезал овощи у нормальных людей вопросов не возникнет. А вот к тому, что чтобы обнять жену ты тоже вынужден брать в руки нож, и ещё и непрерывно в кого-то им тыкать, пока жену обнимаешь - вот к этому вопросики возникают.
В то время как аналогичный плюсовик спокойно положил бы нож на место и пошёл обнимать жену без всякого опасного оружия, не думая о том, а как бы ему ненароком не оказаться посреди кровавого месива.

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

я хотел чтоб воид покритиковали, а вы мне рассказывете только то, что я и сам заню

void* тебе уже покритиковали. Это type erasure, и этим всё сказано. Используя void* повсеместно ты буквально избавляешься от типа там, где тебе его НЕОБХОДИМО сохранить. Из-за это ты вынужден его потом сам восстанавливать по сторонним данным.
Чем это плохо? - да всем. Вообще всем. И для программиста всем плохо, и для компилятора тоже.

Ivan_qrt ★★★★★
()
Последнее исправление: Ivan_qrt (всего исправлений: 1)

void* нужен, void не нужен. В том виде, в котором он сделан в C/C++, по крайней мере.

Причём плюсисты об этом уже думают: https://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0146r1.html https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1014r0.pdf

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 2)

Когда это твой код, то может и ничего плохого, а когда ты приходишь на проект, а там эти void* к месту и не к месту и куча легаси 20 летнего, то я бы предпочел чтобы всё было строго типизировано.

Loki13 ★★★★★
()

void* плохо так как компилятор не будет ругаться если функция принимает void* и ожидает что это какой-нибудь type1*, а ты передал туда type2*. А std::any будет ругаться если из него взять то что в него не ложили.

Вот сегодня такой баг пофиксил в одной программе: https://github.com/FRRouting/frr/commit/a3877e4444dc3a1253135d3b9479935fc9a966f8

fsb4000 ★★★★★
()

Можно придумать защиту от дурака, но только от неизобретательного(с)

Чем толще проект и чем больше народу в нем трудится тем больше вероятность косяков, соответственно придумываются всякие фичи и подходы для уменьшения вероятности косяков. Юзать их или нет это уже на усмотрение разработчика или его начальства;-)

AntonI ★★★★★
()

Я плюсовик, но люблю смотреть правде в летсо: если плюсовик не обосрёт void*, то окажется что он не нужен. Мы 30 лет старались строить всё так, чтобы тип был и был чоток, а тут оказывается на всё это можно забить куй и всех уволить.

lesopilorama
()

ну не размахивай рукой, гогда у тебя в руке нож, взял, отрезал, положил нож на место.

Это в теории. А на практике этой по сути динамической типизацией компенсируют отсутствие полиморфизма, например:

src/core/ngx_cycle.h:40:    void                  ****conf_ctx;
dimgel ★★★★★
()