LINUX.ORG.RU

Комитет не может остановиться..

 , ,


1

4

Привет, ЛОР!

Я просто оставлю это здесь: https://isocpp.org/files/papers/P2996R4.html

Для Ъ: в C++26 будет добавлена поддержка статической рефлексии. Теперь C++ будет компилироваться ЕЩЁ ДОЛЬШЕ.

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

После принятия концептов SFINAE уходит в прошлое.

Не для всего, к сожалению. В частности pfr и reflect-cpp, определяющие типы через инициализацию агрегатов, делают это именно через sfinae (да и почти всё более-менее сложное метапрограммирование так делает).

Концепты великолепно закрывают область штатного использования шаблонов.

Но вот когда у тебя есть какой-нибудь sequence типов, и тебе их надо преобразовать и отфильтровать с использованием неизвестных тебе типов, в общем случае подходит только sfinae (хотя наверняка в каких-то отдельных ситуациях можно и концепты подтянуть).

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

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

будто что-то плохое

но не думают, нужно ли оно вообще в языке или нет

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

а то получится как с Zig: создатели с фига-то решили, что нормальные строки в языке не нужны, сношайтесь с массивами чаров

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

а то получится как с Zig: создатели с фига-то решили, что нормальные строки в языке не нужны, сношайтесь с массивами чаров

Я вас понимаю, но Зиг он как раз «Си с фичами», там полное управление памятью и относительно низкоуровнево, поэтому ситуация со строками логична.

И я не пытаюсь выпендриваться, но кто только не писал свою библиотечку для строк.

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

Ну вы меня понимаете)

Я, хоть и не особо серьёзно, всё-таки не люблю писать двойные двоеточия там, где в остальных языках везде просто точки.

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

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

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

Но лично меня ещё больше, чем это бесит -> у указателей. Причём мне вообще не понятно зачем он понадобился? В чём проблема обращаться к методам/полям указателей через точку? Но это вообще наследие сишки.

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

В чём проблема обращаться к методам/полям указателей через точку? Но это вообще наследие сишки.

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

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

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

А существует оно потому что точка это оператор выбора дочернего объекта, а стрелочка это ещё со следованием по ссылке

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

Во-вторых, не было никаких проблем сделать перегрузку точки такой же, как у ->.

Сейчас уже, разумеется, менять что-либо поздно.

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

Нет никакой травмы. Я категорически отказываюсь признавать бредни сумасшедших ISOшников за стандарт Си. Пусть сами этим говном пользуются.

Да-да-да, как и я пишу: душевная травма и отказ от реальности. В воображении пациента существует некий идеализированный язык под названием Си, который был создан Святыми Керниганом и Ритчи, у которого нет современных реализаций (gcc и clang следуют стандарту ISO) и который был богохульно запятнан и осквернён «злыми комитетчиками» (т.е. дьяволом этой мифологии).

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

Пфф, тут целый тред был о переезде ядра с С89, и сишники долго выясняли пора уже или ещё подождать, на основании того где правильно счётчик цикла объявлять

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

Это неверный код. Нельзя называть ничего с _ и тем более с __, если ты не разработчик компилятора или стандартной библиотеки Си.

Во-вторых unsigned long int следует упорядочить в начало, а unsigned int ниже, чтобы структура занимала меньше места.

В-третьих да, оно будет разного размера. И это хорошо, потому что эти переменные будут максимально быстры для конкретной платформы. Например int обязан быть не менее 2-х байт. (На современных десктопах обычно 4 байта). Допустим ты пишешь код с циклом for и создаешь счетчик int i. На 16-битной платформе скорее всего int будет скорее всего как раз 2 байта и работать быстро. На 32-битной платформе он будет 4 байта скорее всего и вмещать больше и работать так же быстро. А если ты напишешь «намертво» какой-нибудь int32_t, то на 16 битной платформе компилятор включит в бинарник свою библиотеку длинной арифметики и будет обрабатывать операции с числами (которые фактически никогда не вылезут за 2 байта) в несколько раз медленнее. Если хочешь быть уверен, что знаковое целочисленное число будет 4 байта или больше, используй long или unsigned long для беззнаковых.

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

В-третьих да, оно будет разного размера. И это хорошо, потому что эти переменные будут максимально быстры для конкретной платформы.

Это будет максимально НЕХОРОШО когда пакет с этой структурой придет на другую архитектуру.

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

Используй типы, которые гарантируют нужный размер, тогда. Си сделан именно так, чтобы максимально легко переносить низкоуровневые программы на разные платформы.

А зачем тебе именно такой тип? Просто интересен контекст.

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

Используй типы, которые гарантируют нужный размер, тогда. Си сделан именно так, чтобы максимально легко переносить низкоуровневые программы на разные платформы.

Их нет в C.

А зачем тебе именно такой тип? Просто интересен контекст.

Затем чтобы я мог передать число через сеть?

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

Их нет в C.

https://en.wikipedia.org/wiki/C_data_types#Main_types

Смотри колонку «Minimum size (bits)»

Затем чтобы я мог передать число через сеть?

Не обижайся, но тут меня прям на смех пробило. В общем, так делать нельзя. Читай про big-endian и little-endian. Ты обязан все передавать по сети как набор байт.

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

Смотри колонку «Minimum size (bits)»

Ты понимаешь чем «minimum» отличается от «fixed»?

Не обижайся, но тут меня прям на смех пробило. В общем, так делать нельзя. Читай про big-endian и little-endian. Ты обязан все передавать по сети как набор байт.

Ээ… ты обязан передавать в правильном формате. Размерность тебе сохранять все равно нужно. Ты уверен что ты на C писал?

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

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

Настолько хорошо сделан, что в стандартном C нет ничего для запаковки структур без паддинга, типа __attribute__((packed)) из GCC/шланга.

В K&R этого кстати тоже нет. Видимо, предлагается ручками через char[] пердолиться.

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

Настолько хорошо сделан, что в стандартном C нет ничего для запаковки структур без паддинга, типа attribute((packed)) из GCC/шланга.

Как мы выяснили, это все для сосунков. Настоящие мужики побайтово пишут в сокет.

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

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

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

Тебе все равно придется считать/записать набор байт и конвретировать их в число с помощью функций. Опять-таки потому что бывают big-endian и little-endian машины. И (видимо речь про драйвер) для максимальной портируемости должен делать именно так.

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

Тебе все равно придется считать/записать набор байт и конвретировать их в число с помощью функций.

Зачем, если можно считать структурку?

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

Ничего. Он для внутреннего хранения данных в оперативке. Пишешь функцию, которая получает указатель на структуру и возвращает указатель на char (набор байтов). И наоборот для перевода бинарного формата во внутреннее представление.

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

Как офигительно. А теперь допиши, скомпилируй одно для big-endian, а второе на little-endian машине и убедись, что данные не будут переданы корректно.

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