но один из указателей можно привести к числу (преобразовать дату в количество дней) и тогда он в сумме рассматривается как смещение
это смещение должно быть относительно другого указателя (другой даты) из этих двух, но оно относительно нуля (1 января 1 н.э.), поэтому смысла в сумме нет
Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false. The result has type int.
И чем скомпилированный код будет отличаться
По задумке: будет отличаться отсутствием ветвления (jump'а) => нет работы для предсказателя переходов => не может быть ошибки предсказания перехода => результат быстрее, чем при ошибке предсказания (и стабильный по скорости, если нас волнует утечка информации).
В реальности: GCC на -O0 (!!) распознаёт за этими 5 операциями x < y ? x : y, которое тоже компилируется без ветвления в cmov (ветвление vs. предикация). https://godbolt.org/z/51YWe7c1s
Чтобы код из статьи "заработал", нужно оружие сильнее, чем -O0:
Пища для ума от цикла статей: что иногда можно найти под капотом компилятора и почему так нельзя делать вручную.
В соседней ветке разговор ушёл куда-то в сторону "стандартный Си местами даёт меньше, чем LLVM (если другой язык завяжется на возможности LLVM, он автоматически окажется впереди)".
Здесь пришли к тому, что стандарту языка нет дела до низкоуровневых возможностей и надо завязываться на расширения компилятора, чтобы попытаться получить желаемое.
Вот самый настоящий алармизм есть у экологов касательно сведения с орбиты (влияние на океаны и т.д.). Они за километр обходят вопрос "каков вклад космонавтики относительно других загрязнителей" и, видимо, из корыстных соображений.
упадёт на Луну большинство сгорит в атмосфере улетит неизвестно куда случайно забросить гайки
Ну кто так бочки с гайками взрывает. Это больше похоже на нервное "запомни, таких игр не существует, тебе ещё два курса проучиться две звездные системы колонизировать" (башорг #395556). Начать с ретроградного аналога геостационарной орбиты, его в учебниках истории станут называть "первое кольцо Земли"...
Не факт. Зависит от реализации. Может любое ненулевое число дать.
Эту скрепу отняли у сишников в C23 (предложения N2218&N2330 родом из C++ (P0907R4&P1236R1)).
The sign representation defined in this document is called two’s complement. Previous editions of this document (specifically ISO/IEC 9899:2018 and prior editions) additionally allowed other sign representations.
Тоже зависит от реализации
Эту (отсутствие гарантии sign extension) любовно оставили, обрезав предложение при портировании из C++. Это значит, что у комитета была на уме некая архитектура без arithmetic shift right, где будет поддерживаться C23 (вместе с его плюсово-шаблонными _BitInt'ами), но не будет поддерживаться C++20. Достаточно важная архитектура, чтобы избегать там медленной эмуляции инструкции. Достаточно заметная, потому что в компиляторах под неё задокументировано поведение (Implementation-Defined обязует), необычное. Но называть архитектуру они не станут. А может и не было её... но сама идея, что такую архитектуру можно придумать (черновое название - ds9k) и периодически про неё напоминать, сама идея прекрасна.
Милорд, они уже бегут на Rust, Zig и GNU C? Не надо бояться, все не убегут!..
А ещё бывает, что компилятор вроде и умеет в __builtin_parity, но реализовано оно медленнее, потому что готовой инструкции под это дело в целевом процессоре нет. Попробуйте в этом godbolt-сниппете выбрать, скажем, 32-х битную архитектуру PPC (power gcc 15.0.2). Там компилятор вообще сгенерит немаленький такой код, да ещё и вызывающий встроенную функцию (__paritysi2); это не будет быстро.
Он генерирует вызов функции из поста. Пока что разница в том, что на godbolt он не инлайнится и надо смотреть дальше у себя, если нужна производительность на той платформе. Это же и в других местах повторится, пользы от решения проблем с (?) LTO будет больше, чем велосипедостроения.
Это расширение, а не часть стандарта языка, так что есть случаи, когда использовать такое — не комильфо
Лучше на него сначала наткнуться, GCC и LLVM - это тоже стандарты, которые зачастую важнее бумажного. Хотел сказать, что к тому времени стандарт могут и поправить, но это уже сделали в C23 (__builtin_popcount→stdc_count_ones_ui).
К биту чётности (и, наверное, много где ещё) не хватает предупреждения, что не надо пытаться быть умнее компилятора - он имеет __builtin_parity...__builtin_parityll и знает про Parity-Flag-для-младшего-байта в вашем процессоре и с какой микроархитектуры доступна popcnt. https://godbolt.org/z/qdo7x435f
К ошибке в макросах - что о них всё рассказывают правила SEI CERT C. Что опасно нарушать, что нет, как исправлять - 13 правил.
«dma bypass» (программный метод обхода защитных механизмов).
Лучше часть убрать, она заменяется на printf("%p\n", bar); (или printf("0x%"PRIxPTR"\n", (uintptr_t)bar);) и пропадают ошибки (лишний volatile, sizeof считает размер указателя на буфер, а не буфера, указатель на функцию с такой-то сигнатурой где нужен просто указатель, разбор на отдельные байты сталкивает нас с endianness'ом железа, а так как повсюду little-endian, то выводится неправильно).
И, кажется, его странно желать как новую фичу вместо какого-либо общего механизма. User-defined префиксы/суффиксы к строковым литералам, например.
В D шаблоны могут играть префиксов (some_template!"string literal") и uniform call syntax позволяет записывать вызов функции "как суффикс" ( "string literal".foo() или "string literal".foo с учётом, что "any function can be used like a property").
Ещё более интересные качественные улучшения работы с числами предусмотрены в языке J ... Например, можно записать 5*sqrt(π) как 5p0.5.
Да он, автор оригинала, издевается. Либо это часть мотива "помянуть APL (J - это APL для обычной клавиатуры) каким-нибудь добрым словом, ибо Кеннет Айверсон одним из первых подумал об адаптации языков программирования к работе с массивами".
В APL была ненормальная идея, что всё надо записать в один символ. log - три буквы. ln - две буквы. ⍟ - вот теперь нормально.
Как выглядит подходящий мир для дирижаблей?.. Нужна максимально тяжёлая инертная замена для азота, которая бы ещё не расслаивалась в смеси с кислородом.
Веселее звучит "летали на натуральных оболочках для сосисок". Где-то была карикатура про дефицит сосисок из-за графа Цеппелина. Есть такая статья про запрет сосисок:
A document prepared in 1922 for the US National Advisory Committee for Aeronautics shows just how important cow guts – also known as goldbeater's skins – were to the military effort.
"The collection of the goldbeater's skins was very systematic in Germany during the war," it reads. "Each butcher was required to deliver the ones from the animals he killed. Agents exercised strict control in Austria, Poland and northern France, where it was forbidden to make sausages."
более тонны бомб, самолетам того времени и не снилось
Википедия говорит, что "Илья Муромец" в 1914 мог брать полтонны бомб. С жёсткими дирижаблями вместо бомбардировщиков тогда сильно ошиблись, и Сикорскому ресурсов в России не хватало.
Нандий (nandium), драмий...
Ну, аналогия с указателем хорошо работает.
складывать их запрещено правилами языка
но один из указателей можно привести к числу (преобразовать дату в количество дней) и тогда он в сумме рассматривается как смещение
это смещение должно быть относительно другого указателя (другой даты) из этих двух, но оно относительно нуля (1 января 1 н.э.), поэтому смысла в сумме нет
Вариант с diff и расширением знака на все биты:
поиск максимума:
Clang распутывает в
cmovна -O1.GCC на любых уровнях не справляется и сохраняет алгоритм.
поиск минимума: оба не распутывают
https://godbolt.org/z/e4b63vd49
Она таки всегда вела себя одинаково:
Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false. The result has type int.
По задумке: будет отличаться отсутствием ветвления (jump'а) => нет работы для предсказателя переходов => не может быть ошибки предсказания перехода => результат быстрее, чем при ошибке предсказания (и стабильный по скорости, если нас волнует утечка информации).
В реальности: GCC на -O0 (!!) распознаёт за этими 5 операциями
x < y ? x : y, которое тоже компилируется без ветвления вcmov(ветвление vs. предикация).https://godbolt.org/z/51YWe7c1s
Чтобы код из статьи "заработал", нужно оружие сильнее, чем -O0:
GNU extended asm с подобранным ограничением
Весь код и asm - на godbolt.
Пища для ума от цикла статей: что иногда можно найти под капотом компилятора и почему так нельзя делать вручную.
В соседней ветке разговор ушёл куда-то в сторону "стандартный Си местами даёт меньше, чем LLVM (если другой язык завяжется на возможности LLVM, он автоматически окажется впереди)".
Здесь пришли к тому, что стандарту языка нет дела до низкоуровневых возможностей и надо завязываться на расширения компилятора, чтобы попытаться получить желаемое.
Вот самый настоящий алармизм есть у экологов касательно сведения с орбиты (влияние на океаны и т.д.). Они за километр обходят вопрос "каков вклад космонавтики относительно других загрязнителей" и, видимо, из корыстных соображений.
https://www.grunge.com/1090709/how-space-debris-is-affecting-the-worlds-oceans/
Гидразин - канцероген. При температурах сведения он распадётся... но сам факт!
Ну кто так бочки с гайками взрывает. Это больше похоже на нервное "запомни, таких игр не существует, тебе ещё
два курса проучитьсядве звездные системы колонизировать" (башорг #395556). Начать с ретроградного аналога геостационарной орбиты, его в учебниках истории станут называть "первое кольцо Земли"...* чем от велосипедостроения
* лучше сначала натолкнуться на такой случай, прежде чем действовать
Эту скрепу отняли у сишников в C23 (предложения N2218&N2330 родом из C++ (P0907R4&P1236R1)).
The sign representation defined in this document is called two’s complement. Previous editions of this document (specifically ISO/IEC 9899:2018 and prior editions) additionally allowed other sign representations.
Эту (отсутствие гарантии sign extension) любовно оставили, обрезав предложение при портировании из C++. Это значит, что у комитета была на уме некая архитектура без arithmetic shift right, где будет поддерживаться C23 (вместе с его плюсово-шаблонными _BitInt'ами), но не будет поддерживаться C++20. Достаточно важная архитектура, чтобы избегать там медленной эмуляции инструкции. Достаточно заметная, потому что в компиляторах под неё задокументировано поведение (Implementation-Defined обязует), необычное. Но называть архитектуру они не станут. А может и не было её... но сама идея, что такую архитектуру можно придумать (черновое название - ds9k) и периодически про неё напоминать, сама идея прекрасна.
Милорд, они уже бегут на Rust, Zig и GNU C? Не надо бояться, все не убегут!..
Он генерирует вызов функции из поста. Пока что разница в том, что на godbolt он не инлайнится и надо смотреть дальше у себя, если нужна производительность на той платформе. Это же и в других местах повторится, пользы от решения проблем с (?) LTO будет больше, чем велосипедостроения.
Лучше на него сначала наткнуться, GCC и LLVM - это тоже стандарты, которые зачастую важнее бумажного. Хотел сказать, что к тому времени стандарт могут и поправить, но это уже сделали в C23 (
__builtin_popcount→stdc_count_ones_ui).Если гнаться за непротиворечивостью, то
char const * s1, чтобы тип легко читался (указатель на... const... char).Но непротиворечивость - это не про Си и у неё есть цена.
Цена непротиворечивости в D, наглядно (размерность читается справа налево, а индексы слева направо).
К биту чётности (и, наверное, много где ещё) не хватает предупреждения, что не надо пытаться быть умнее компилятора - он имеет __builtin_parity...__builtin_parityll и знает про Parity-Flag-для-младшего-байта в вашем процессоре и с какой микроархитектуры доступна popcnt. https://godbolt.org/z/qdo7x435f
К ошибке в макросах - что о них всё рассказывают правила SEI CERT C. Что опасно нарушать, что нет, как исправлять - 13 правил.
Нет, это
Лучше часть убрать, она заменяется на
printf("%p\n", bar);(илиprintf("0x%"PRIxPTR"\n", (uintptr_t)bar);) и пропадают ошибки (лишний volatile, sizeof считает размер указателя на буфер, а не буфера, указатель на функцию с такой-то сигнатурой где нужен просто указатель, разбор на отдельные байты сталкивает нас с endianness'ом железа, а так как повсюду little-endian, то выводится неправильно).И, кажется, его странно желать как новую фичу вместо какого-либо общего механизма. User-defined префиксы/суффиксы к строковым литералам, например.
В D шаблоны могут играть префиксов (
some_template!"string literal") и uniform call syntax позволяет записывать вызов функции "как суффикс" ("string literal".foo()или"string literal".fooс учётом, что "any function can be used like a property").Да он, автор оригинала, издевается. Либо это часть мотива "помянуть APL (J - это APL для обычной клавиатуры) каким-нибудь добрым словом, ибо Кеннет Айверсон одним из первых подумал об адаптации языков программирования к работе с массивами".
В APL была ненормальная идея, что всё надо записать в один символ.
log- три буквы.ln- две буквы.⍟- вот теперь нормально.Как выглядит подходящий мир для дирижаблей?.. Нужна максимально тяжёлая инертная замена для азота, которая бы ещё не расслаивалась в смеси с кислородом.
Веселее звучит "летали на натуральных оболочках для сосисок". Где-то была карикатура про дефицит сосисок из-за графа Цеппелина. Есть такая статья про запрет сосисок:
Из карикатур на дирижабли(?)-сосиски сейчас такое гуглится
Американцы с 1921 летали на гелии. Просто у них он был, а у других - нет.
Википедия говорит, что "Илья Муромец" в 1914 мог брать полтонны бомб. С жёсткими дирижаблями вместо бомбардировщиков тогда сильно ошиблись, и Сикорскому ресурсов в России не хватало.
Угу, из неудачного супероружия в WW1 ещё был царь-танк, недостроенные сверхтяжёлые танки K-Wagen, парижская пушка...
Боромир предложил бы и сложить два указателя...