The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Релиз набора компиляторов GCC 13, opennews (??), 26-Апр-23, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


12. "Релиз набора компиляторов GCC 13"  –1 +/
Сообщение от Tita_M (ok), 26-Апр-23, 17:44 
> bool, false и true

Кто лучше знает, это получается, что в новом стандарте Си появился полноценный булевый тип? Что мешало добавить его раньше?

Ответить | Правка | Наверх | Cообщить модератору

14. "Релиз набора компиляторов GCC 13"  –1 +/
Сообщение от Аноним (14), 26-Апр-23, 17:51 
Не особо нужен. char и значений 0, 1 всегда хватало.
Си, в отличие от C++ - это не о абстракциях.
Ответить | Правка | Наверх | Cообщить модератору

85. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Tron is Whistling (?), 26-Апр-23, 22:20 
Конкретно с char(byte) ты бахнешься на процах, которые требуют выравнивания при обращении к памяти.
Ну или займёшь 64-битное слово на каждый буль.
Ответить | Правка | Наверх | Cообщить модератору

97. "Релиз набора компиляторов GCC 13"  –1 +/
Сообщение от Аноним (97), 26-Апр-23, 23:12 
Плохому танцору известно что мешает. В 2023 жаловатся на вышеперечисленное просто смешно.
Ответить | Правка | Наверх | Cообщить модератору

124. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 27-Апр-23, 05:59 
Можно юнионом укладывать в чар 8 булей. А выравнивание -- это проблема компилятора.
Ответить | Правка | К родителю #85 | Наверх | Cообщить модератору

133. "Релиз набора компиляторов GCC 13"  –2 +/
Сообщение от Аноним (133), 27-Апр-23, 08:46 
Чо... хранить логические переменные в одном бите? Ну можно, конечно, но изврат какой-то.
Ответить | Правка | Наверх | Cообщить модератору

137. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (137), 27-Апр-23, 09:05 
погугли, что такое программирование, а потом про битовые поля
Ответить | Правка | Наверх | Cообщить модератору

220. "Релиз набора компиляторов GCC 13"  +/
Сообщение от InuYasha (??), 27-Апр-23, 18:15 
И тут аноны откроют для себя флаги. )
Ответить | Правка | Наверх | Cообщить модератору

243. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (228), 27-Апр-23, 23:47 
они всегда были затратные если только одно битовое поле. Хард программирование исключается из утверждения.
Ответить | Правка | К родителю #137 | Наверх | Cообщить модератору

177. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 27-Апр-23, 13:30 
Нет, лучше в 64. Параллельно запивая смузи.

Обычный приём, который преподаётся в старших классах при изучении страктов и юнионов.

Ответить | Правка | К родителю #133 | Наверх | Cообщить модератору

275. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Срыватель покровов (?), 28-Апр-23, 10:23 
Мало в каких школах дают Сишечку. В основном дают Питон сейчас. Си скорее на первом курсе изучают.
Ответить | Правка | Наверх | Cообщить модератору

314. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 29-Апр-23, 17:20 
Верно, но это уже неустранимые проблемы нынешней системы образования, обсуждать которые -- значит скатиться в политоту.

Так-то по-нормальному в младших классах должны быть основы информатики -- алгоритмизация, простейшая формальная логика с соответствующими задачами. В средних классах -- Питон, в старших -- Джава/Си/Го/Хруст на выбор и основы системного администрирования.

Ответить | Правка | Наверх | Cообщить модератору

317. "Релиз набора компиляторов GCC 13"  –1 +/
Сообщение от Аноним (317), 30-Апр-23, 01:18 
В младших - Assembler, в средней школе - Brainfuck, в старших - Rust!
По выпуску устраивать в M$ архитекторами ядра.
Ответить | Правка | Наверх | Cообщить модератору

318. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 30-Апр-23, 01:36 
Молодец, теперь попробуй осуществить свой педагогический эксперимент, начав с собственных детей. Если, конечно, успел настрогать.
Ответить | Правка | Наверх | Cообщить модератору

245. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (245), 27-Апр-23, 23:59 
> Можно юнионом укладывать в чар 8 булей.

Лучше struct'ом. Проблема однако в том что это хотя и сэкономит RAM под були, сгенерит лишний код на RMW этого счастья. Результат как правило медленнее работает и жирнее по коду, так что особого профита с этого лайфхака не наступает.

Ответить | Правка | К родителю #124 | Наверх | Cообщить модератору

305. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 28-Апр-23, 20:36 
Код будет жирнее -- ну может быть, от компилятора и опций зависит. Что будет медленнее -- не верю.

В крайнем случае можнно просто создать переменную типа int8_t, и для манипуляций с конкретным битом использовать операции по маске. И в /** камментах **/ не забыть написать, для чего используется каждый бит :)

Ответить | Правка | Наверх | Cообщить модератору

332. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 01-Май-23, 00:13 
> Код будет жирнее -- ну может быть, от компилятора и опций зависит.

Чтобы хранить 8 булей в 1 байте... внезапно, выставить бит в 1 более не немедленное присвоение переменной значения, типа mov r0, #1, а уже вполне себе RMW байта (или что там) - надо прочитать текущее значение, пропатчить, выставив в 1 нужный бит и сохранить назад. И обращений в память 2. Если неаккуратно делать можно еще и на гонки нарваться, если не байт а что-то крупнее и доступ не атомарный был.

> Что будет медленнее -- не верю.

А таки - может. И бывает.

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

Так вы и тут на RMW пролетаете, вы ж не можете просто заассайнить ему нужное, еще и предыдущее сохранять надо! Иначе упакованые флаги отправятся нафиг.

> **/ не забыть написать, для чего используется каждый бит :)

Я пробовал и так и сяк. В 1м случае компилер врезает RMW, автоматически, в 2м случае еще и самому мануально надо, совсем уж хрень, возни больше, результат тот же (правда, u8 проще портабельно слать в IO/file/etc vs struct). А если bool как инт оформлен, RMW не надо, ведь там 1 бит, он сразу известен. Не надо чтение старого значения и маски, внезапно. Классический разгон скорости выполнения за счет большего потребления RAM.

Ответить | Правка | Наверх | Cообщить модератору

101. "Релиз набора компиляторов GCC 13"  +2 +/
Сообщение от oficsu (ok), 26-Апр-23, 23:58 
Серьёзно, char в качестве bool? Чтобы strict aliasing многого о себе не возомнил? Типичный такой эффективный Си
Ответить | Правка | К родителю #14 | Наверх | Cообщить модератору

238. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от Аноним (228), 27-Апр-23, 23:13 
Поэтому в добром Си, на котором писали ОС, и не было этого типа. Была логика: 0 и всё остальное.
И можно выбирать для хранения выровненный тип.
Но пришло другое поколение и появился bool и auto (
Ответить | Правка | Наверх | Cообщить модератору

136. "Релиз набора компиляторов GCC 13"  +3 +/
Сообщение от Аноним (137), 27-Апр-23, 09:00 
то чувство, когда маленькие дети не знают про stdbool.h, но рассказывают всем о том, как всегда было
Ответить | Правка | К родителю #14 | Наверх | Cообщить модератору

15. "Релиз набора компиляторов GCC 13"  +7 +/
Сообщение от Жироватт (ok), 26-Апр-23, 17:57 
[ ] Деды (Ритчи и Керниган) не пользовались, и тебе не надо.
[ ] Не писали с валио-трулио, неча и начинать.
[ ] Нуля и единицы хватит всем.
[ ] Зачем тебе тип, который всего 1 бит, если быстрее юзать выровненные по размеру регистра целые?
[ ] А для поля таких флажков тем более выровненные по регистру слово/полуслово, да в десятичном виде!
[ ] Так быстрее же!
[ ] Зачем терять 7 бит на мусор, когда нужен всего 1?
[ ] Читаемый код должен быть тому, кто сидит около регистров, а не мимо-пацану с тремя классами алгола церковно-фортановой школы!

-----
Выбирай любой набор причин.

Ответить | Правка | К родителю #12 | Наверх | Cообщить модератору

18. "Релиз набора компиляторов GCC 13"  +/
Сообщение от xsignal (ok), 26-Апр-23, 18:20 
А зачем он нужен? По-моему 0/1, проще чем false/true.
Ответить | Правка | К родителю #12 | Наверх | Cообщить модератору

40. "Релиз набора компиляторов GCC 13"  +3 +/
Сообщение от Вы забыли заполнить поле Name (?), 26-Апр-23, 20:11 
Разная смысловая нагрузка (типы они для людей): получается ты своим болевым типом можешь делать тоже что с целым числом (складывать, умножать и и.п.) - зачем это нужно? Ты можешь возразить, что можно просто так не делать, но тогда мы перекладываем дополнительные поверки на погромите, а ему и так есть над чем думать.
Ответить | Правка | Наверх | Cообщить модератору

52. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (60), 26-Апр-23, 21:15 
0/что_угодно_целое
for(int i=10;i;i--){
//тело
}
Лучше так не писать
Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

67. "Релиз набора компиляторов GCC 13"  +3 +/
Сообщение от Аноним (74), 26-Апр-23, 21:51 
> А зачем он нужен? По-моему 0/1, проще чем false/true.

Например:


uint8_t var1 = 256;
if (var1) do_something(); // Хоть var1 не ноль на вид, там 0 и сюда не попадем!


bool var1 = 256;
if (var1) do_something(); // А вот тут будет вызвано (var1 == true)

Секрет в том false залекларен как 0, true как 1, а все что больше обрубается при матеметике до 1. И в принципе можно при статическом анализе варнинги кидать если там более 1. Меньше места для прострела пяток в целом. Просто более специфицированный под задачу begavior, более уместный.

Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

106. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от _kp (ok), 27-Апр-23, 01:03 
>>uint8_t var1 = 256

На подобное заведомое переполнение gcc ругается.
И когда из большего типа в меньше без приведения типа присваивают, тоже ругается.

Про bool - верно.

Ответить | Правка | Наверх | Cообщить модератору

123. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (123), 27-Апр-23, 05:58 
> На подобное заведомое переполнение gcc ругается

И это если повезёт. Недавно искал проблему в коде, где

> printf("%d == %d (%d)\n", a, b, a == b);

выводило то ли "9 == 11 (1)", то ли "11 == 11 (0)" просто из-за такого вот неопределённого поведения где-то рядом в коде, после которого компиятор получил карт-бланш на любые извращения в целях копеечной оптимизации.

Ответить | Правка | Наверх | Cообщить модератору

246. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 28-Апр-23, 00:08 
> На подобное заведомое переполнение gcc ругается.

Это был простейший пример. В реальном коде будет нечто ближе к:


uint8_t var1 = 255;
...
var1++;
if (var1) ... // Ну и вот кто тут про ноль из-за mod(2^8) math подумает? :)

...и на это ругаться уже не будет в общем случае.

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

Если кто храбрый -Wconversion ему в руки, узнаете много нового о своем коде и его (без)глючности и (без)опасности в плане работы с целыми числами.

> Про bool - верно.

Его все же специально сделали для логических выражовываний, с inеeger'ами это не сколько более стремное занятие.

Ответить | Правка | К родителю #106 | Наверх | Cообщить модератору

276. "Релиз набора компиляторов GCC 13"  +/
Сообщение от _kp (ok), 28-Апр-23, 10:23 

> Если кто храбрый -Wconversion ему в руки,

Да, 90% бестолковых предупреждений, но для своего кода, так использую, иногда помогает же.
Но оно не отлавливает опечатки с присвоеним разных типов, и если типы совпадают по размеру, то по мнению компилятора сойдёт и так.

Ответить | Правка | Наверх | Cообщить модератору

333. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от Аноним (237), 01-Май-23, 00:30 
> Да, 90% бестолковых предупреждений,

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

> но для своего кода, так использую, иногда помогает же.

Сильно повышает качество кода. И я про него узнал от Ian Colett - автора LZ4, в его бложике о том как писать код качественнее и надежнее.

> и если типы совпадают по размеру, то по мнению компилятора сойдёт и так.

Это какой-то совсем нишевой случай. Для pointer vs integer вопли есть, struct'ы логично юзать через typedef'ы и так чужой структ совсем скормить без явного желания нереально.

Ответить | Правка | Наверх | Cообщить модератору

342. "Релиз набора компиляторов GCC 13"  +/
Сообщение от _kp (ok), 01-Май-23, 10:33 
>> Да, 90% бестолковых предупреждений,
> Вообще-то вполне толковых,

Вообще то, в первую очередь интересует отлов ошибочного присваивания не тому типу, хоть и того размера, а не приведения типов. Хотя в коде предназначенном для сборки для 32 и 64 битных систем, грабли найдутся и там.
Но, поскольку лучше по максимуму отловить проблемы на стадии компиляции, а не из багрепортов, то мне более приемлимы  "бестолковые" предупреждения. И исходник считается вменяемым, если нет предупреждений при включении практически всех опций, кроме Wpedantic.

Ответить | Правка | Наверх | Cообщить модератору

347. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от Аноним (-), 02-Май-23, 03:43 
> Вообще то, в первую очередь интересует отлов ошибочного присваивания не тому типу,
> хоть и того размера, а не приведения типов.

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

> Хотя в коде предназначенном для сборки для 32 и 64 битных систем,
> грабли найдутся и там.

В нормально написаном портабельном коде там вообще грабель не должно быть. Для себя я предпочитаю C99 и конкретные размеры типов, для точно определенного диапазона значений, так что платформа либо предоставляет мне ЭТО либо "out of luck" (с 99го года почти четверть века прошла).

> Но, поскольку лучше по максимуму отловить проблемы на стадии компиляции, а не
> из багрепортов, то мне более приемлимы  "бестолковые" предупреждения.

Я даже false alarm статических анализаторов затыкаю. Потому что не прочь поразвлечься всяким микроконтроллерным и управляющим и последнее что я хочу это баги в таких применениях. В этом месте параноидальные варнинги и статический анализ очень хорошая идея.

> И исходник считается вменяемым, если нет предупреждений при включении
> практически всех опций, кроме Wpedantic.

Я переживаю как минимум Wall, Wpedaitic, Wconverson и как минимум cppcheck еще. Если кто-то из них недоволен, это еще не релизное качество.

Ответить | Правка | Наверх | Cообщить модератору

349. "Релиз набора компиляторов GCC 13"  +/
Сообщение от _kp (ok), 02-Май-23, 12:35 
>> Вообще то, в первую очередь интересует отлов ошибочного присваивания не тому типу,

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

> В нормально написаном портабельном коде там вообще грабель не должно быть.

Чужой код в принципе не бывает нормальным, и особенно тот в котором попросили исправить "мелочи" или доработать. Шутка, но с долей правды.


Ответить | Правка | Наверх | Cообщить модератору

352. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (58), 07-Май-23, 07:39 
> Это считай руко%опство в проектах которые пишут несколько человек, и особенно в
> разное время, и оно плохо плохо обнаружимо, и может даже вполне
> работать.. пока не тронешь.

Мне пример этого интересен, как бы это могло выглядеть. Потому что сходу баг такого типа не припоминается особо. И хотелось бы понять как и почему это образуется и (если это выглядит правдоподобно) как этого можно было бы избегать.

> Чужой код в принципе не бывает нормальным, и особенно тот в котором
> попросили исправить "мелочи" или доработать. Шутка, но с долей правды.

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

Ответить | Правка | Наверх | Cообщить модератору

113. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Ванёк (?), 27-Апр-23, 02:14 
Если использовать uint8_t как bool, то производительность упадёт. Лучше использовать uint32_t - производительность выше.
Ответить | Правка | К родителю #67 | Наверх | Cообщить модератору

122. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (123), 27-Апр-23, 05:55 
> Лучше использовать uint32_t - производительность выше

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

Ответить | Правка | Наверх | Cообщить модератору

160. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от n00by (ok), 27-Апр-23, 11:46 
А что там такое может храниться может на практике, что разные ядра лезут в смежные ячейки?
Ответить | Правка | Наверх | Cообщить модератору

157. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от _kp (ok), 27-Апр-23, 11:17 
> Если использовать uint8_t как bool, то производительность упадёт. Лучше использовать uint32_t
> - производительность выше.

Для intel 32bit - да. А других архитектурах может быть быстрее.

Ответить | Правка | К родителю #113 | Наверх | Cообщить модератору

190. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Ванёк (?), 27-Апр-23, 14:59 
На x86_64 операции с uint32_t будут быстрее, чем с uint8_t и uint16_t.
Ответить | Правка | Наверх | Cообщить модератору

204. "Релиз набора компиляторов GCC 13"  +/
Сообщение от фф (?), 27-Апр-23, 16:25 
а на AVR?
Ответить | Правка | Наверх | Cообщить модератору

213. "Релиз набора компиляторов GCC 13"  +/
Сообщение от _kp (ok), 27-Апр-23, 17:12 
> а на AVR?

Вы сами догадываетсь.

На Cortex и Risc-v 32bit 8/16 битный bool быстрее 32х битного.

Ответить | Правка | Наверх | Cообщить модератору

221. "Релиз набора компиляторов GCC 13"  +/
Сообщение от n00by (ok), 27-Апр-23, 18:15 
> На x86_64 операции с uint32_t будут быстрее, чем с uint8_t и uint16_t.

Когда будут и кто обещал? Пока операции с регистрами занимают одинаковое количество тактов (uint16_t не беру в расчёт, это почти не используют), а чтение из памяти в сумме быстрее для компактных данных.

Ответить | Правка | К родителю #190 | Наверх | Cообщить модератору

231. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Ванёк (?), 27-Апр-23, 22:04 
> Когда будут и кто обещал?

См. документацию по ассемблеру x86_64.

Ответить | Правка | Наверх | Cообщить модератору

271. "Релиз набора компиляторов GCC 13"  +/
Сообщение от n00by (ok), 28-Апр-23, 08:40 
>> Когда будут и кто обещал?
> См. документацию по ассемблеру x86_64.

Зачем я буду смотреть всякую чепуху, какую Вы и процитировать стесняетесь? Я смотрю 64-ia-32-architectures-optimization-manual.pdf (см. цитату в №222), AMD_Athlon_Processor_x86_Code_Optimization_Guide.pdf и Software Optimization Guide for AMD Family 17h Processors-55723_3_01_0.zip

Ответить | Правка | Наверх | Cообщить модератору

222. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от n00by (ok), 27-Апр-23, 18:21 
>> Если использовать uint8_t как bool, то производительность упадёт. Лучше использовать uint32_t
>> - производительность выше.
> Для intel 32bit - да. А других архитектурах может быть быстрее.

Из относительно современных нашёл такое только для Atom (не путать с Silvermont и более новыми - 45 nm Intel Atom processors introduced Intel Atom microarchitecture. The same microarchitecture also used in 32 nm Intel Atom processor)

D.3.3.5
Parameter Passing
Due to the limited situations of load-to-store forwarding support in Intel Atom microarchitecture, param-
eter passing via the stack places restrictions on optimal usage by the callee function. For example, “bool”
and “char” data usually are pushed onto the stack as 32-bit data, a callee function that reads “bool” or
“char” data off the stack will face store-forwarding delay and causing the memory operation to be re-
issued.
Compiler should recognize this limitation and generate prolog for callee function to read 32-bit data
instead of smaller sizes.

Assembly/Compiler Coding Rule 18. (MH impact, M generality) For Intel Atom processors, “bool”
and “char” value should be passed onto and read off the stack as 32-bit data.

Ответить | Правка | К родителю #157 | Наверх | Cообщить модератору

247. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 28-Апр-23, 00:12 
> Если использовать uint8_t как bool, то производительность упадёт. Лучше использовать uint32_t
> - производительность выше.

Вот прям так универсально? Ну попробуйте свой совет на AVR. И получите пролет по скорости в разы. Компилеру виднее как bool оформить потребно на его платформе в вон тех гарантиях. Переумничать компилер? Вы скорее пятки себе прострелите с таким уровнем знаний.

Ответить | Правка | К родителю #113 | Наверх | Cообщить модератору

151. "Релиз набора компиляторов GCC 13"  –1 +/
Сообщение от fidoman (ok), 27-Апр-23, 10:24 
"uint8_t var1 = 256;"

И в этом весь C. Сделать для быстрого косособачинга кривую функцию компилятора (обрезание типов молча) и гору ad-hoc библиотечных функций. Заявить этот набор "стандартом". 30 лет со всем этим мяснить, порождая горы прог и утилит, дырявых в самых неожиданных местах. Через 30 лет начать пытаться сделать из этого Паскаль с C-синтаксисом.

Ответить | Правка | К родителю #67 | Наверх | Cообщить модератору

184. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Пользователь чебурнетаemail (?), 27-Апр-23, 14:22 
> И в этом весь C. Сделать для быстрого косособачинга кривую функцию компилятора
> (обрезание типов молча) и гору ad-hoc библиотечных функций. Заявить этот набор
> "стандартом". 30 лет со всем этим мяснить, порождая горы прог и
> утилит, дырявых в самых неожиданных местах. Через 30 лет начать пытаться
> сделать из этого Паскаль с C-синтаксисом.

А теперь ещё раз и по-русски.

Ответить | Правка | Наверх | Cообщить модератору

264. "Релиз набора компиляторов GCC 13"  +/
Сообщение от _ (??), 28-Апр-23, 05:23 
дитё порвало ( | )  :-D
сию конструкцию засунуть в компилятор и понять что не собеётся, ума (предсказуемо) - не хватило :)
Ответить | Правка | Наверх | Cообщить модератору

272. "Релиз набора компиляторов GCC 13"  +/
Сообщение от n00by (ok), 28-Апр-23, 08:50 
И соберётся и запустится. Эффект окажется для некоторых неожиданным. Особенно для перепутавших компилятор с линкером.
Ответить | Правка | Наверх | Cообщить модератору

334. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (237), 01-Май-23, 00:31 
> сию конструкцию засунуть в компилятор и понять что не собеётся, ума (предсказуемо)
> - не хватило :)

Соберется, но в современных компилерах warning выдаст.

Ответить | Правка | К родителю #264 | Наверх | Cообщить модератору

249. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 28-Апр-23, 00:14 
> И в этом весь C. Сделать для быстрого косособачинга кривую функцию компилятора
> (обрезание типов молча)

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

> утилит, дырявых в самых неожиданных местах. Через 30 лет начать пытаться
> сделать из этого Паскаль с C-синтаксисом.

Где там и чего от паскаля вообще? Это я как прогавший на паскале спрашиваю.

Ответить | Правка | К родителю #151 | Наверх | Cообщить модератору

23. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (23), 26-Апр-23, 18:35 
Он уже был в С11 как _Bool, сейчас stdbool.h решили деприкейтнуть.

Сам bool вообще штука так себе, например в структурах DoP лучше не добавлять его. Он по-сути нужен только при касте, т.к каст у int другой.

Ответить | Правка | К родителю #12 | Наверх | Cообщить модератору

69. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от Аноним (74), 26-Апр-23, 21:53 
Он и вон тем stdbool'ом был как bool вывешен (как typedef вроде). То что для нормального була вместо левоватого _Bool надо добавочный хидер вообще смотрелось странновато как по мне.
Ответить | Правка | Наверх | Cообщить модератору

71. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (74), 26-Апр-23, 21:56 
Целочисленные типы сей как булеан довольно опасная штука, они врапаются по основанию 2, как минимум unsigned - и можно внезапно получить инверсную логику.

Для signed превыщение min/max это по сути UB, хотя в 23 и последних плюсах вроде собирались регламентировать только 1 формат представления (twos complement) и тогда это уже "defined behavior" будет. Но в более ранних не указано как знак и знаковые хранить и там возможно нескллько вариантов. Формально валидных и - с разным поведением при переполнении, потому и UB.

Ответить | Правка | К родителю #23 | Наверх | Cообщить модератору

102. "Релиз набора компиляторов GCC 13"  +/
Сообщение от oficsu (ok), 27-Апр-23, 00:04 
> Для signed превыщение min/max это по сути UB, хотя в 23 и последних плюсах вроде собирались регламентировать только 1 формат представления

Ну да, оставили только two's complement

> и тогда это уже "defined behavior" будет

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

Ответить | Правка | Наверх | Cообщить модератору

250. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 28-Апр-23, 00:17 
> Ну да, оставили только two's complement

Видимо дотумкало что столько UB сколько там есть - не рулит совершенно.

>> и тогда это уже "defined behavior" будет
> Нет, не будет. Поскольку возможность переполнения мешает ещё и оптимизатору

Если остался только 1 формат хранения - по идее его wrap конкретно определен уже. А оптимизатор не имеет права нарушать иллюзии прописаные в стандарте. Хотя я и не смотрел этот кусок на тему гарантий, стандарт еще не вышел даже вроде?!

Ответить | Правка | Наверх | Cообщить модератору

315. "Релиз набора компиляторов GCC 13"  +/
Сообщение от oficsu (ok), 29-Апр-23, 20:14 
> по идее его wrap конкретно определен уже

Ну, допустим. Дело же не в нём. Проблема в том, что оптимизатор может заложиться на тот факт, что число не переполняется, а значит и можно выпилить явные/неявные ветки кода, ожидающие переполнения

Оптимизатор видит, что x == 10 и x только инкрементится — всё, ветку if (x == 9) {} можно просто выкинуть

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

>  А оптимизатор не имеет права нарушать иллюзии прописаные в стандарте

Так стандарт не позволяет переполнения, а значит и оптимизатор, выкидывающий лишние ветки, тоже ничего не нарушает — он заложился на отсутствие гарантий. Из-за этого, например, код с беззнаковыми может быть местами медленнее

> стандарт еще не вышел даже вроде?!

Стандарт — нет, но его черновик можно посмотреть или на гитхабе комитета в виде исходников, или собранный на eel.is/c++draft

Ответить | Правка | Наверх | Cообщить модератору

335. "Релиз набора компиляторов GCC 13"  +/
Сообщение от Аноним (-), 01-Май-23, 00:40 
> Ну, допустим. Дело же не в нём.

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

> Проблема в том, что оптимизатор может заложиться на тот факт, что число
> не переполняется, а значит и можно выпилить явные/неявные ветки кода,
> ожидающие переполнения

Для unsigned это вообще оптимизация - заложиться в коде на размер чтобы mod 2^N вообще нахаляву получить. Актуально криптоалгоритмам всяким и тому подобному. Для signed это не практиковалось из-за UB.

> Оптимизатор видит, что x == 10 и x только инкрементится — всё,
> ветку if (x == 9) {} можно просто выкинуть

Это катит только если он может _доказать_ это. И даже так он может лопухнуться, потому что видит он все-таки не все. Скажем IRQ - оптимизер не видит, однако его вышибают в пользу другого кода. Для подобных случаев есть volatile. В чем то похожие проблемы есть в многопоточных конструкциях.

>  У нас не механизм переполнения оказывает влияние на производительность, а само
> наличие такой гарантии

А вот это большой вопрос. Оптимизер может в дофига случаев пруфнуть те или иные граничные условия и вообще например обрубить функцию с кучей switch ... case до пары команд, доказав что оно получает только 1, 5 и 7 на вход по вообще всей программе. LTO в этом очень крут.

> Так стандарт не позволяет переполнения, а значит и оптимизатор, выкидывающий лишние ветки,
> тоже ничего не нарушает — он заложился на отсутствие гарантий. Из-за
> этого, например, код с беззнаковыми может быть местами медленнее

Это было актуально ДО C23 но актуально ли для него - а вот это интересно.

> Стандарт — нет, но его черновик можно посмотреть или на гитхабе комитета
> в виде исходников, или собранный на eel.is/c++draft

Зачем мне драфт на C++ если мы про си?

Ответить | Правка | Наверх | Cообщить модератору

26. "Релиз набора компиляторов GCC 13"  +5 +/
Сообщение от Совершенно другой аноним (?), 26-Апр-23, 18:43 
Тип и раньше был, как минимум с C99, только надо было включать stdbool.h. А если без включения, то был _Bool.
Ответить | Правка | К родителю #12 | Наверх | Cообщить модератору

96. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от FF (?), 26-Апр-23, 23:12 
макаки написали, макаки убежали, им бесполезно доказывать, они не программисты
Ответить | Правка | Наверх | Cообщить модератору

159. "Релиз набора компиляторов GCC 13"  +1 +/
Сообщение от n00by (ok), 27-Апр-23, 11:33 
>> bool, false и true
> Кто лучше знает, это получается, что в новом стандарте Си появился полноценный
> булевый тип? Что мешало добавить его раньше?

Когда язык проектировали как замену ассемблеру, тогда булевый тип хранился во флагах процессора. Тогда идея заставить компилятор тратить под один бит целый байт выглядела дикой - это оставляли на совесть программисту.

Ответить | Правка | К родителю #12 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру