LINUX.ORG.RU
ФорумTalks

Опрос: Три-пять лучших фич C++

 , ,


3

4

Поскольку я с недавних пор устроился на работу, то простыни временно закончились. Тем не менее, каждый раз при работе с сишным кодом снова и снова всплывает мысль «блин, как же здесь не фатает крестов». Но в остальном сишки мне более чем хватает, мне не нужны геттеры-сеттеры, классы-интерфейсы под single responsibility, и прочая мура. Пару источников вдохновения:

https://google.github.io/styleguide/cppguide.html
https://yosefk.com/c fqa/

Итак, назовите от трех до пяти фич крестов, которые бы вы взяли с собой на необитаемый остров Си. Можно несуществующие или из будущих стандартов. А я чуть позже назову те, которые взял бы я. (назвал)

И да, я в курсе, что где-то год назад ведьмак создавал тред на схожую тему, но мое знание крестов с тех пор выросло настолько, что меня чуть не взяли работать крестовиком. Так что теперь тред вести буду я. Как обычно, «для себя из прошлого», чтоб гештальты позакрывать.

Итоги по состоянию на 24.12.2021 22:00 (MSK): https://pastebin.com/bxamaGDY

★★★★

Последнее исправление: byko3y (всего исправлений: 6)

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

Потоки я тоже не использую. А вот filesystem использую.

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

В результате получится намного больше продублированного кода с большим шансом совершить ошибку.

+1. Зачем изобретать велосипед, если велосипед уже сделали умные опытные люди?

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

Без using namespace b; и namespace a = b; это совсем не то.

// goo.h
#ifndef GOO_H
#define GOO_H
#include "foo.h"
extern namespace_struct const goo;
#endif // GOO_H

// goo.c
#include "goo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const goo = { my_bar, my_baz };

// other_main.c
#include <stdio.h>
#include "foo.h"
#include "goo.h"
int main(int argc, char** argv) {
  namespace_struct const * const xoo = (argc > 1 ? foo : goo);
  xoo->baz();
  printf("%d", xoo->bar(3, "hello"));
  return 0;
}
olelookoe ★★★
()
Ответ на: комментарий от X512

Ну вот и с твоим предложением на тему выкидывания из стандартной либы будет то же самое :) И так уже было когда все изобретали свои изводы STL

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

А с чего ты взял, что они умные и опытные?

С того, что инкапсуляцию, наследование и полиморфизм не выкинули сразу на мороз, а тащат уже 30 лет. Значит, проверенная временем технология.

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

Какой экстремистский экстремизм. Список столь серьзных проектов будет?

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

а также std::unique_ptr (shared_ptr слишком жирный).

Ты это так сформулировал, будто реально считаешь, что unique_ptr и shared_ptr решают одну и ту же задачу, и являются просто двумя конкурирующими реализациями.

i-rinat ★★★★★
()
Ответ на: комментарий от slackwarrior

В GCC она намертво прибита к исходникам компилятора и её ещё замучаешься правильно кросскомпилировать чтобы исключения не сломались.

X512 ★★★★★
()

Итак, мой список, как и обещал:

1. Лямбды. В расширениях GNU C есть вложенные функции, но иметь возможность гонять туда-сюда по программе код с ассоциированными данными — это намного круче простых вложенных функций.

2. Модули. Уже и так, и сяк к ним подбираются, а никак не могут подобраться. Реализация раздельной компиляции в C/C++ — это пережиток прошлого, и индустрия не продвинется, пока не научится «компилировать заголовки» (не путать с предварительно отпарсенными заголовками, которые нынче принято называть «предварительно скомпилированными»).

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

4. Продвинутые типы-контейнеры должны быть частью компилятора. Как минимум массив, кортеж, алгебраические типы данных.

С этим списком вы получаете напорловину решенную проблему RAII, поскольку, реализация конструкторов-деструкторов и исключений в C++ откровенно хреновая. Эта модель обработки ошибок и высвобождения ресурсов произошла из лиспа, но у лиспа есть очевидное преимущество — сборщик мусора. Мое любимое жизненное правило по теме: не можешь срать — не мучай жопу. C++ не может обеспечить достаточно надежное RAII, потому нет смысла пытаться примастырить то, что никак не налазит.

RTTI и рефлексия могли бы быть пятым пунктом, но, к сожалению, я не могу придумать эффективную форму для этих штук. Они как бы подразумевают метапрограммирования и динамическую типизацию, но нынешний C++ настолько убог в этих нишах, что я не готов серьезно говорить про их завоевание.

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

Критики полно :) Набирай любой концепт в гугле со словами «concidered harmful», «bullshit» и «crap» :))

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

Напиши тогда сам без накладных расходов с помощью макросов или кодогенерации. Гном, кстати, несмотря на «плохой рантайм», работает гораздо шустрее KDE.

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

Работать будет, согласен. Но надо знать типы и всё это делать вручную, как фича языка оно куда лучше выглядит и проще в использовании.

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

За Пуст в серьезных проектах в лучшем случае бьют по рукам, а в худшем - увольняют

Boost очень большой, там есть отдельные годные либы, вроде intrusive containers.

byko3y ★★★★
() автор топика
Ответ на: комментарий от i-rinat

Для счётчика ссылок я предлагаю использовать наследование объекта от общего класса счётчика ссылок, вроде IUnknown или BReferenceable. Два счётчика ссылок для одного объекта и отдельный блок в памяти – это перебор и в большинстве случаев не требуется.

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

Это странная концепция, зачем ей библиотека, т.к. интрузив что-то ты можешь организовать сам, просто кладя в список поля объектов с указателями, а не сами объекты :) Или не указатели, а вообще «теги» или «номера».

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

с помощью макросов или кодогенерации

Зачем если есть готовый C++?

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

Кто прав?

Выхлоп профайлера :) Все остальное «маняощущения»

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
  1. Исключения.
  2. Шаблоны (без всякой магии, просто шаблоны, чтобы можно было делать обобщённые контейнеры).
  3. Классы, можно без виртуальных методов и наследования. В целом виртуальные методы тоже иногда пригождаются, но и просто классы это полезно.
  4. Пространства имён.
  5. Синтаксические мелочи, например чтобы () писать вместо (void).
Legioner ★★★★★
()
Ответ на: комментарий от slackwarrior

Это странная концепция, зачем ей библиотека, т.к. интрузив что-то ты можешь организовать сам, просто кладя в список поля объектов с указателями, а не сами объекты :) Или не указатели, а вообще «теги» или «номера»

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

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

что там отлаживать в списке из next-prev указателей? :) Свободные функции их обработки? :) Или «классы» с этими методами?

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

Его можно через класс с лямбдой и деструктором сделать.

Нельзя, потому что в defer можно будет кидать исключения, а в деструкторе не всегда можно кидать исключения. JeanHeyd Meneide говорил что после включения defer в С, будет от него предложение в комитет по поводу включения defer также в С++.

Вот полное видео на эту тему: https://www.youtube.com/watch?v=8JxsyAqdo0U

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

что там отлаживать в списке из next-prev указателей? :) Свободные функции их обработки? :) Или «классы» с этими методами?

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

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

С интрузив-структурами обратно это будут либо свободные функции, либо методы классов. И что же там такого в красно-черных деревьях, что заставляет тебя кидать понт будто это рокет-саенс? :)

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

Однако, они должны использоваться не для реализации STL

Это еще почему?

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

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

С интрузив-структурами обратно это будут либо свободные функции, либо методы классов. И что же там такого в красно-черных деревьях, что заставляет тебя кидать понт будто это рокет-саенс?

То, что это не делается за пару часов, но требуется достаточно часто, чтобы люди с ментальностью «да что там связанный список написать», «да что там аллокатор свой сделать», «стандартыне строки? да зачем они нужны» не подпускались ни к одному коммерческому проекту. По крайней мере я бы не позволил тебе растянуть сроки релиза в 2-3 раза из-за «разве ж это рокет-саенс?». Или может быть ты пользуешься самописным компилятором, и браузер, через который ты мне пишешь, у тебя тоже свой?

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

Как интересно можно реализовать готовые алгоритмы для статически типизированного языка без шаблонов? При том, что ты не знаешь заранее ни типов контейнеров ни типов элементов

Ну посмотри на Go, например. Там даже без шаблонов встроенные типы полиморфны. Потому что приколочены в компилятору. Эта приколоченность дает возможность их лучше оптимизировать, выдавать более адекватные сообщения об ошибках, и намного быстрее компилировать.

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

Это все уже сделано много раз :) А ты все еще с ментальнстью изобретателя колеса, первооткрывателя что луна не из зеленого сыра.

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

По крайней мере я бы не позволил тебе растянуть сроки релиза в 2-3 раза из-за «разве ж это рокет-саенс?».

Ты и не в том положении, чтоб мне что-то позволять-не позволять :)

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

А как быть с пользовательскими типами контейнеров и типами элементов?

Про сообщения об ошибках я уже писал.

Про скорость компиляции. Это точно имеет большое значение, что код компилируется на сколько-то быстрее с современным железом? Может лучше сфокусировать внимание на скорости выполнения? А то такими доводами вообще JS всех уделывает.

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

Или может быть ты пользуешься самописным компилятором, и браузер, через который ты мне пишешь, у тебя тоже свой?

Ты же понты кидаешь, наверное у тебя все свое? :) То деревья, то вдруг компилятор-браузер :) Ты определись, об чем твои понты.

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

Возможность компилировать формулы с кастомными типами. То есть - минималистичные классы (можно без наследования/полиморфизма итд) чтобы этот самый кастомный тип описать, и возможность перегрузки операторов.

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

Или может быть ты пользуешься самописным компилятором

А у меня есть недоделанный для Си с доп. фичами (языка), собирался на него перейти но пока не успел.

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

А как быть с пользовательскими типами контейнеров и типами элементов?

Понять и простить. Я упомянул очень простые штуки, в том числе на основе которых можно писать составные контейнеры, и уж при самом-самом крайнем случае писать что-то по-настоящему свое. Без строк в 2021 очень неприятно писать программы, знаешь ли.

Про скорость компиляции. Это точно имеет большое значение, что код компилируется на сколько-то быстрее с современным железом? Может лучше сфокусировать внимание на скорости выполнения? А то такими доводами вообще JS всех уделывает

Да, JS и Go, индустрия своё слово сказала.

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

Дык C и есть ООП язык. Даже поболее ООП чем плюсы. Просто ООП является не единственной парадигмой в которой пишется код. А с учетом того что ООП не так уж и хорош по своей сути, то очень часто преимущество отдается в сторону процедурщины либо функциональщины…

Jetty ★★★★★
()

Имхо лучший Си это современный Паскаль, единственное, что регистрозависимости не хватает.

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