LINUX.ORG.RU

Использовать ли голые указатели, new, delete и т.п. в новом проекте или сразу начинать с стандарта 11+?

 


0

6

Использовать ли голые указатели, new, delete и т.п. в новом проекте или сразу начинать с стандарта 11+?

Перемещено hobbit из general

Ответ на: комментарий от zx_gamer

Стандарт может ввести требование поддерживать __attribute__

Нет, не может. Они хотели, но у них не получилось. Слишком много кто в лес, кто по дрова.

и смысла в этом будет больше, чем от [[такого]] синтаксиса атрибутов

Нет, не будет, потому что [[такой синтаксис]] - это новый синтаксис с семантикой, описанной в стандарте, который можно если не реализовать, то хотя бы безопасно проигнорить. А с __attribute__ легко нарваться на идентичное написание, но разное поведение в ньюансах.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Собстно, чё далеко ходить:

The __restrict keyword differs from the __declspec (restrict) modifier in the following ways:

Тут в рамках одного компилятора ножки на льду разъезжаются. А когда их 20+ - представить страшно.

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

GCC
Clang
MSVC

Вот 3.

Apple Clang

См. 2 пункт.

EDG eccp

Только фронтэнд для C++ гуглится.

Intel C++

А, ну его GCC сильно обогнал даже на процессорах Intel. Но, да, забыл я про него.

Nvidia HPC C++

Это же для программирования под Nvidia CUDA и OpenMP.

Cray C/C++ (CC)

Тоже какой-то мутный компилятор. Нигде не видел его поддержки под #ifdef. А вот Borland, Watcom и т.п. — видел.

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

См. 2 пункт.

Нет, не см. Технически - это разные комплияторы.

Intel C++

А, ну его GCC сильно обогнал даже

Да хера-с-два. У интела компилятор не ради компилятора, а компилятор ради библиотек, которые идут с компилятором. И там никто никого не обогнал даже близко.

Ещё у амуды свой форк силанга, но я не знаю, чё с ним.

Cray C/C++ (CC)

Тоже какой-то мутный компилятор.

Какой-то мутный - это ты. А Cray - это Cray. Крэя знать надо.

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

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

zx_gamer ★★★
()
Последнее исправление: zx_gamer (всего исправлений: 1)
Ответ на: комментарий от m0rph

Владеющих голых указателей лучше избегать

Подписываюсь под каждым словом, особенно «владеющих».

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

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

Так что да, избавляет от new и delete.

Есть ли какие-то объективные причины использовать смарт-поинтеры, если new вызывается в конструкторе, а delete в деструкторе? Ну, кроме того, что меньше строчек.

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

«люди» не отдупляют ( и это хорошо!?) что индексы в массиве == что указатели

а потом натыкешься на чела который умеет в указатели но не различает имя от именуемого

ибо практика может замещать понимание

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от s3rjke

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

James_Holden ★★★★★
()

Начни с C++98. Когда почувствуешь, что чего-то не хватает поищи в C++ > 98. А лет через 15, когда окончательно устанешь, переходи отдыхать на Haskell/OCaml/F#.

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

Есть ли какие-то объективные причины использовать смарт-поинтеры, если new вызывается в конструкторе, а delete в деструкторе?

Да, exception safety. Если ты заньювил указатель в конструкторе, а потом улетел в исключение. Для этого, к примеру, достаточно вызвать new еще разок.

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

нет — то что ты указал это

(1.4) — dynamic storage duration

[basic.stc#general-1.4] (https://eel.is/c draft/basic.stc#general-1.4)
[basic.stc.dynamic] (https://eel.is/c draft/basic.stc.dynamic)

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

117 символов в строке?

Тут даже классический STL короче и яснее будет.

Как это читать? Ну если filter еще более-менее понятно, то что такое bind_front? Как можно понять, не залезая в документацию? Что-то связывается с чем-то спереди? std::bind1st переизобрели или что? Абсолютно дебильное название, которое не говорит о смысле функции.

И это все еще ужасно в сравнении с приведенным мной примером. Я напомню: мы линейный поиск делаем, а тут буковок прям выше крыши. Функцией линейного поиска будут пользоваться, если она короче написания for. Если for написать короче, то пользоваться этой функцией нет смысла. Печатать больше, кода больше, следовательно, багов больше, ясности меньше.

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

Потому что указатель удобнее итератора.

и чем же удобнее?

Указатель может неявно быть проверен на NULL

а итератор на `end()` (да и зачем на nullptr проверять если ищешь в контейнере?)

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

Удобнее тем, что реализация функция не торчит наружу. Просил объект — на указатель на объект.

Нет, итератор не может быть проверен неявно на end.

Проверять на нулевой указатель за тем же, зачем и на end, убедиться, что объект найден.

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

так а если будет нужно чото сделать с передачей самого инвокабл объекта? в твоём случае будет неуниверсально — а так будет все универсально — но ты как я понял явный неприветственник для разных стилей программирования (функционального в частности)

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

Конкретно find в 99% случаев нужен по всему контейнеру, а не по подмножеству. И ситуация настолько плоха, что единственное существующее стандартное решение - std::ranges::search.

std::ranges::find, std::ranges::find_if, std::ranges::find_if_not
safocl ★★
()
Ответ на: комментарий от s3rjke

ну ты же и сделаешь свой смарт-поинтер по сути тогда — зачем кодировать что уже накодировано? ну и в `std::` обычно все самое лучшим образом заоптимизированное — вдобавок еще и компилятор-определённым способом

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

std::bind1st переизобрели или что?

нет — просто начинается бинд с начала, — есть еще `std::bind_back`

не залезая в документацию

а как вообще что-то юзать не читая документацию? по словам явно тут на самом деле — что принимает уже документацию почитать))

И это все еще ужасно в сравнении с приведенным мной примером

ну это уже с моей точки зрения субъективно — и не имеет никакого смысла обсуждать)

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

ну и в std:: обычно все самое лучшим образом заоптимизированное

STD - это не про оптимизацию, а про максимально правильную реализацию чего-то стандартного. Оптимизировать там обычно нечего. Что там в std::vector оптимизировать, оно тупое как полено внутри. А вот написать std::vector чтобы идеоматически всему что надо соответствовало со всеми там итераторами - вот где в дурку уедешь. Если бы STD был прям офигеть как «оптимизирован», не появлялось бы всяких альтернативных библиотек с контейнерами. Ну, да, альтернативные появляются не потому, что STD не оптимизировано, а скорее потому, что в STD не всё есть, но иногда и по первой причине, например люди хотят какой-то особый свой vector с какими-то приколами, которые в их мире считаются «оптимизировано».

lesopilorama
()
Последнее исправление: lesopilorama (всего исправлений: 1)
Ответ на: комментарий от safocl

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

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

а никто не говорит, что нужно при каждом чихе выделять в динамическом сторадже — но для того, что бы не забыть есть как раз уже сделанное — смарт-поинтеры, контейнеры, алгоритмы...
не использовать динамическую память это плохой совет, поскольку тогда пришлось бы «ванговать» что бы выделить в автоматическом или ином нединамическом варианте стораджа (в обыденности называют «на стеке»)...

safocl ★★
()