• 0
    Quake III Arena, о котором идёт речь в статье, вышел в 1999 году, а int стал 32-битным (сначала это было даже опционально, в зависимости от модели памяти) с распространением 32-битных операционок, т.е. ещё на пару лет раньше.
    Какие, к терапевту, 32-битные операционки? 32-битный int — это Doom, 1993й год.
    «Магическая константа» 0x5f3759df
  • 0
    Не имеют. Архитектура процессоров меняется настолько часто, что вы не успеете программу пересобирать под 100 разных архитектур…
    «Магическая константа» 0x5f3759df
  • 0
    1. Таки нет, чисто формально, ибо RSQRTPS — команда SSE1, а это 1999, а не 2005 :)
    AMD K6-III выпускались точно до 2000го года, а компьютеры, я думаю, продавались и позже.

    но всё равно это сильно дороже умножения…
    Не сильно. На каком-нибудь K7 RSQRTPS вообще быстрее умножения. Можете в таблички посмотреть.

    На современных процессорах на оптимизацию подобных инструкций «забили», потому что кто же считает подобные вещи на CPU? Для этого GPU есть…
    «Магическая константа» 0x5f3759df
  • +1
    Для начала, что бы не быть голословным быть может вы мне приведете пример («стандарт, публичные final drafts») где описан такой UB и на каком основании компилятор не заметит изменения «x» после даже такого «гнилого» каста и использует старое (не измененное) значение.


    Да пожалуйста:
    C99 – 6.5 Expressions

    An object shall have its stored value accessed only by an lvalue expression that has one of the following types:
    • a type compatible with the effective type of the object,
    • a qualified version of a type compatible with the effective type of the object,
    • a type that is the signed or unsigned type corresponding to the effective type of the object,
    • a a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
    • an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
    • a character type.


    И сноска: The intent of this list is to specify those circumstances in which an object may or may not be aliased.


    То есть стандарт явно разрешает считать что значение x и значение *(int*)&x никак, совсем никак не связаны между собой. Равно как и значения i и *(int*)&i. Тем самым вторая строка в этом примере — не зависит от первой и от параметров функции. А четвёртая строка — не зависит от третьей. То есть пару из второй и третьей строки можно вынести куда угодно. C учётом того, что значение i, вычисленное в строке 4 ни на что не влияет вообще — можно эту пару строк и удалить…
    «Магическая константа» 0x5f3759df
  • 0
    Причем здесь вообще «strict aliasing»? Тип int (как и float) не являются структурами...
    А какая разница? Strict aliasing гласит, что записать по адресу "(int*)&x" никак не может повлять на значение x!

    он обязан следовать логике преобразования для каста как написано (а не как вы думаете).
    С кастом — всё хорошо. С обращением в память — плохо.

    В следующей программе:
      float x;
      float *q=&x
      int *p=(int*)&x;
      ...
    
    Компилятор имеет право считать, что запись через "*p" и чтение через "*q" (и наоборот) никак друг с другом не связаны. То же самое — в исходной программе. В строке x = *(float*)&i; x получает некоторое значение — но, с точки зрения компилятора, точно не имеющее никакого отношения к тому, что находится в i. Стало быть манипуляции с i — можно перенести ниже. А поскольку строка int i = *(int*)&x; инициализирует i каким-то значением, не имеющим отношения к тому, что находится в i — то это значение тоже можно вынести «вниз». А другая фаза того же компилятора может заметить, после всего этого, что мы пишем в x значение, которое ещё ничем не инициализировано вообще — ну так чего бы туда 0 не записать?
    «Магическая константа» 0x5f3759df
  • +1
    Со вторым не согласен в корне — с какого это перепуга он его вырежет?
    С целью оптимизации кода. Код, который нифига не делает — точно короче того, который что-то делает.

    В худшем случае UB (да и UB на касте int/float мне очень сомнительно)...
    Тут не каст int/float. Тут Type punning. В результате компилятор может, ну, например, переставить работу с целыми числами до работы с плавучкой или после.

    То есть будет что-то подобное:
    float FastInvSqrt(float x) {
      int i;
      float xhalf = 0.5f * x;
      x = *(float*)&i;
      x = x*(1.5f-(xhalf*x*x));
      i = *(int*)&x;  // представим биты float в виде целого числа
      i = 0x5f3759df - (i >> 1);  // какого черта здесь происходит ?
      return x;
    }
    А после можно и «заметить» что мы обращаемся к неинициализированной переменной. Ну и раз мы всё равно можем вернуть что угодно — вернуть 0.
    «Магическая константа» 0x5f3759df
  • 0
    Но вот поддерживать такой проект, скорее всего, не получится.
    Средним «линейщиком» — может быть и нет. Исследователем (пусть даже не тем, который написал код)? Легко. До первого кардинального изменения техзадания, понятно… но — тогда же можно ещё раз за месяц написать совсем другой код! Делов-то…
    Четыре типажа программистов
  • 0
    Потому что им просто было это легко и ненапряжно, пока все другие потели и тужились — они по-быстрому ловили свои зачеты автоматом и шли заниматься более интересными вещами.
    Именно так. Я в МГУ учился и мне было невероятно обидно, когда на третьем курсе я не смог уехать к родственникам на каникулы до Нового Года из-за того, что не сдал экзамен. Один.

    Просто на всякий случай: в те времена, когда когда я там учился первый экзамен официально сдавался 2-3го января.
    Четыре типажа программистов
  • +5
    Он Бейсик написал сам, а операционку купил. Пусть только те, кто смеются над написанием простейшего интерпретатора вспомнят не про то, что это всё-таки в 70е годы было, но, что гораздо более важно — то, что Бейсик Билл Гейтс писал для компиьютера, который он впервые увидел «живьём» во время презентации этого Бейсика заказчику. До этого у него была только документация.

    Вот вы бы так смогли? А «концентрированный исследователь» — смог.
    Четыре типажа программистов
  • +3
    Извините, но это чушь. Я вообще не знаю откуда термин Rock Star взялся. Описание «концентрированный исследователь» описывает ситуацию гораздо лучше. Если бы код казался бы говном его автору, то вы бы его не увидели. Наоборот — скорее всего он таки считает, что код — достаточно близок к оптимуму, если он вам его вообще показывает. Потому тыкать куда-то бесполезно — если там уже не стоит замечение «временная затычка, нужно будет переделать» и так, то «исследователь» вас просто не поймёт. Ну да — в этом месте мы различаем насекомых и птичек по «количеству лап». Почему это плохо если у нас в системе никого, кроме москитов и ласточек не планируется? А вот замечание в стиле ncix на тему «у нас в планах кроме ласточек завести ещё и черепах и хрюшек и важно, чтобы и ласточки и черепахи яйца несли, а хрюшки — нет» — другое дело. Это — конкретная проблема и использование количества лап плюс дополнительного признака начинает выглядеть как костыль, да…
    Четыре типажа программистов
  • +2
    По-моему вы тут описываете не людей, которые хорошо или плохо реагируют на критики, а в чистом виде отличие между линейными программистами и «концентрированными исследователями».

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

    Для последнего — это всего лишь некоторые «эмпирические приёмы» полезность которых в каждом конкретном случае нужно рассматривать отдельно. На заявление «тут нарушен принцип открытости и наружу выставлена кодировка команд x86» вы вполне можете услышать довод «x86 существует уже почти 40 лет, кодировка команд за это время принципиально не менялась и, насколько мне известно, есть по меньшей мере 10 причин по которым этот код ни для чего другого в ближайшие 10 лет никто использовать не будет».

    Это ни хорошо и ни плохо — это просто разные подходы. Я наблюдал как потерю многих лишних человеко-лет на то, чтобы соблюдать SOLID'ную архитектуру, которая была рождена из соображений «открытости» и «принципов разделения интерфейсов», так и катастрофы из-за того, что какая-то вещь, которую «концентрированный исследователь» считал невозможной в принципе таки реализовалась на практике.

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

    С другой стороны тот факт что человек может решать задачи только определённого уровня сложности никто не отменял, так что совсем сложные задачи «линейный программист» решить просто не сможет…
    Четыре типажа программистов
  • 0
    Нематериальная стимуляция кнутом — это что-то новенькое :)
    Почему «кнутом»? Для rock start — это нормальная мотивация. Тем более, что он сам на неё напрашивается.

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

    Однако есть и обратная сторона медали — если после этого вы скажите «это, конечно, прекрасно, но нам это не нужно — сделай, пожалуйста, попроще, чтобы Коля (такой средний-средний „линейщик“) смог это поддерживать», то тут будет уже тааакой откат, что мало не покажется. Вы не только не получите работающего кода через пару месяцев (за которые вышеупомянутый Коля решил бы исходную, «некрасивую» задачу) — хорошо если вы получите какое-то решение задачи через полгода.
    Четыре типажа программистов
  • +1
    Кому верить и отчего это зависит?
    От компилятора. GCC разрешает подобные трюки, правда с оговорками, clang — нет.

    Непонятно, впрочем, зачем всё это, если есть переносимая реализация:

    Смотрите сами
    $ cat cast.cc
    #include <string.h>
    
    int float_to_int(float x) {
      int result;
      memcpy(&result, &x, sizeof(float));
      return result;
    }
    khim@khim:~/work/android/android-standalone/prebuilts/clang/host/linux-x86/clang-4053586/bin$ ./clang++ -O3 -S cast.cc -o- | c++filt
            .text
            .file   "cast.cc"
            .globl  float_to_int(float)
            .p2align        4, 0x90
            .type   float_to_int(float),@function
    float_to_int(float):                      # @float_to_int(float)
            .cfi_startproc
    # BB#0:
            movd    %xmm0, %eax
            retq
    .Lfunc_end0:
            .size   float_to_int(float), .Lfunc_end0-float_to_int(float)
            .cfi_endproc
    
            .ident  "Android clang version 5.0.300080  (based on LLVM 5.0.300080)"
            .section        ".note.GNU-stack","",@progbits
    


    Как видите никакого вызова memcpy нигде не остаётся и всё «честно».
    «Магическая константа» 0x5f3759df
  • +3
    Вообще-то мы обсуждаем, какой уровень компетентности и зарплат должен быть у программиста, чтобы писать примеры в 20 строчек на С++ безошибочно.

    Опыт показывает — что весьма-весьма большой.
    То, что вы лично на это не способны — не говорит о требуемом опыте. Наш опыт показывает, что хорошие студенты на это вполне способны и для этого не требуется 30 лет опыта работы с C++.

    Не важно, кто лично ошибся.
    Ну Ok.

    Важно, что ошиблись сеньоры и в коде копеечной длины.
    Понятно. Принцип Все пидорасы, а я — д’Артаньян — абсолютно незыблем, потому когда вдруг оказывается, что единственный невменяемый сеньор тут — это вы, то резко становится полезно забыть о том кто лично ошибся.

    А для Си — хватает намного меньшего уровня и зарплаты. И вот эта разница в зарплатах в 5-10 раз не оправдывается уменьшением времени написания и отладки на С++.
    Ну если единственное преимущество Си — это пониженная зарплата, то с точки зрения соискателя лучше C++ — и просто не стоит идти на работу туда, где используется Си, разве нет?
    Куда деваются программисты после 40
  • +3
    Да просто С++ такой язык, что даже очень опытные программисты не могут сходу написать пример на стандартном С++. У вас — какая-то фишка за рамками С++ 14, khim пропустил кучу инклудов
    Вообще — вы первый человек, который считает, что иллюстрационные примеры — должны быть всегда и исключительно полной программой. Хорошо хоть Makefile.am и configure.ac прилагать не требуете…

    Зато Си — легко проходит через любой компилятор.
    Я бы сказал, что оно легко входит в любой компилятор — а вот уж что оттуда выходит… это другой вопрос.

    Судя по приведенному тут коду — ошибки есть даже в маленьких примерах.
    По приведённым примерам мало о чём можно судить, уж извините. Задача большинства конструкций C++ — сделать так, чтобы ошибка была обнаружена во врема компиляции и не дожила до стадии запуска программы (не говоря уже о её развёрывании и прочем).

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

    Тем не менее пример linux показывает, что можно писать большие проекты и на Си.
    А пример Multics показывает, что и на PL/1 можно — но вот стоит ли?
    Куда деваются программисты после 40
  • 0
    Агат — это немного изувеченный Apple ][ с дисководом. Со всеми вытекающими…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • 0
    До меня наконец-то дошло, что я тупил с rpath, который можно поменять прямо в пусковом файле.
    А до меня только сейчас дошло что вы вообще пытались сделать. Мдаа… Ну то есть интеллектуально я понимал и понимаю, что rpath можно добавить и в библиотеку тоже — но ситуации, когда это может понадобиться настолько экзотические, что я как-то никогда не осознавал, что это кто-то может реально попробовать сделать!
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • 0
    Если грубо — ты никогда не видел macOS, и тем более в нём не работал. Теоретик.
    Я боюсь вы не то что PRAM очистить не сумеете если его вам какое-нибудь дурацкое расширение испортит, но и не скажете в какой версии MacOS появилась поддержка PowerPC и в какой — исчезла поддержка 68K. Или вообще начнёте утверждать, что MacOS Classic с Intel'овскими процессорами «дружить» умеет…

    Особенно интересен пассаж про «надёжность» macOS.
    Я уж не знаю что вы тут пытаетесь заявлять — либо что MacOS X по прежнему валится от малейшего чиха, как и её предшественница, с которой её объединяет лишь название, либо вы всерьёз считаете что операционка с кооперативной многозадачностью и без защиты процессов друг от друга могла быть надёжной. Она была не шибко надёжнее своего конкурента, уж извините…
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • +8
    Это было реально круто на процессорах Z80 или 6502, на которых отсутствовала операция умножения. Современные же процессоры перемножают числа за 2-3 такта, так что необходимость в подобных трюках, в общем и целом, отпала…
    «Магическая константа» 0x5f3759df
  • +12
    Что-то с 2005 года поменялось в теории сложности или архитектуре процессоров
    Таки да
    «Магическая константа» 0x5f3759df
  • +2
    С современными компиляторами этот код вообще использовать нельзя, нарушения стандарта — они такие, да. Компилятор вполне может «соптимизировать» весь этот код в «return 0».
    «Магическая константа» 0x5f3759df
  • 0
    Вы при сборке указывали rpath? А если нет — то с какого перепугу библиотеки должны искаться где-то, кроме системных каталогов?
    Я не могу собрать тот же libBASS.so самостоятельно, так как на него нет исходников. Иначе бы я сразу всё сделал через статику.
    Причём тут сборка libBASS.so? rpath задаётся при сборке бинарника. Прочтите же, наконец, статью. Она — как раз для таких, как вы…

    Не вижу никакого мусора в том, чтобы всё что относится к одной программе лежало в одной папке.
    А саму программу как вы при этом найдёте? В Linux принят подход при котором программы живут в /usr/bin и в /usr/local/bin — а вот уж там вашим библиотекам делать точно нечего. Это поведение по умолчанию. То, чего вы хотите — тоже возможно, но это — нестандартное поведение.

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

    Хотя я понимаю другое, что когда-то были придуманы какие-то стандарты, от которых теперь невозможно отказаться, хотя удобства в них я не вижу.
    Они реально удобны — если вы собираете свою программу как «пакет» под соответствующую операционку. А если хотите чего-то другого — ручки соответствующие тоже есть.

    Но может быть это просто взгляд со стороны Windows.
    Это попытка придти со своим уставом в чужой монастырь… Обычно это кончается слезьми…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • 0
    Секунду… разве Linux ищет либы по умолчанию в папке с запускаемым файлом?
    По умолчанию — нет. Но если вам это очень нужно — можно добавить $ORIGIN в rpath. Ссылку на статью я давал.

    Он же любит искать в lib64 и /usr/lib64, а в папку с пусковым файлом он вообще не ходит по таким делам, насколько я понимаю.
    Правильно понимаете. Это сделано специально. Не должны разделяемые библиотеки быть частью бинарника — для этого статические библиотеки есть! Но если вам очень хочется такого поведения — это тоже возможно.
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • +1
    Скажите, а это моя ошибка, что своем примере вы пропустили #include, constexpr sqrt и using namespace?
    Нет, ваша ошибка в том, что вы, увидев чего-то, чего вы не понимаете сразу решили, что я «облажался» (ну эта — «настоящие» программисты, они ж идиоты по определению и ничего писать не могут без IDE) и вместо конструктивной дискуссии занялись обсиранием. Если вы бы спросили про инклуды и константные числа две недели назад — я бы объяснил откуда что берётся, но вам же этого не нужно было, ведь так?

    Да, с _с не компилится никак. Но я не воюю с типографскими опечатками. Мало ли что там вылезло при переносе из rich text в plain.
    Ну да, мы ж самые умные. А я ведь старался, подсказки давал.

    Которую я вас сильно прошу исправить и привести пример, компилируемый на Clang 3.8 или более ранних.
    Ну если вам так сильно хочется увидеть килотонны бойлерплейта, то, вот, пожалуйста Не забудьте, что там кнопочка download есть — чтобы в будущем не пенять на то, что откуда-то rich text выскчил и всю малину вам испортил.

    На официально не выпущенном компиляторе (clang 5.0)
    Может он официально ещё и не вышал, но одна официально уже вышедшая операционка собрана именно им — и мне было лень искать что-то ещё.

    Руку на отсечение пока не дам, но на 90% уверен, что без constexpr sqrt не получится присвоить constexpr переменной.
    Не получится. И не должно было получиться. Как я написал с самого начала — я взял кусок примера — а так как раз constexpr sqrt был. Это таки не баг, а фича.

    Ссылочку на пример от DistortNeo открыть религия не позволяет?
    Позволяет — но я не телепат угадывать кого ещё вы имели в виду.

    А откомпилировать и убедиться, что он тоже налажал?
    Открыл, проверил. Всё работает.

    Ну то есть ни вы ни @DistortNeo в сеньоры не годитесь. Ибо налажали на простых примерах. И как будете реагировать?
    Обьяснять работодателям, что людей, которые ведут риторику по принципу Все пидорасы, а я — д’Артаньян на работу лучше не брать. Оба примера — работают (хотя второй — только с GCC… мой немного сложнее, но зато пресловутый «C++35» не нужен и потому работает и с clang'ом и с GCC).

    Признаете себя мидлом или все-таки согласитесь, что С++ излишне сложен и налажать на нем пара пустяков?
    Ну это у вас надо спросить — потому как только вы тут налажали (причём многими разными способами) с C++. Ваш вариант с C, надо сказать, меня удивил — не знал, что clang может вычислять корни во время компиляции… но, как уже было сказано — речь-то не о корне, а о гарантированных вычислениях во время компиляции. С++ их даёт, С — нет. Проверять ассемблерный вывод всё время — как-то в XXI веке странно.

    Значит проверьте ещё раз и убедитесь, что вы его исковеркали при вставке в пост.
    Вы уж извините, но я его специально скопировал из поста в pastebin, чтобы не было разночтений. Ничего там не исковеркано и Хабр показывает то, что было задумано, уж извините.
    Куда деваются программисты после 40
  • +1
    Добро пожаловать в 21й век
    Добро пожаловать, да. В век, который <a показал что бывает если вложить деньги в "дома и больницы", а не в безопасность.

    Ставить вопрос «а давайте сделаем то что было у майкрософта двадцать лет назад» — как минимум не правильно
    Почему неправильно? Банальное импортозамещение, да.

    надо вкладывать в современные направления — банальный линукс + прости господи доступный Эльбрус.
    Это — другая история. И вовсе не факт, что так будет дешевле. Этот ваш «прости господи доступный Эльбрус» вполне может исполнять ReactOS, так что одно другому не противоречит…

    ибо я не помню станков которые подключены в интернеты и ждут отмашки для саботажа.
    Когда-то и банальная персоналка как-то обходилась без того, чтобы каждые 35 дней «звонить в центр». И трактора не нужно было взламывать.
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • 0
    Пусть рынок сам разберется что ему надо
    Рынку денег надо, по большому счёту.

    не надо заставлять бюджетников жрать кактусы.
    Надо, Федя, надо. Рынок никогда и нигде сам по себе не обеспечивает безопасность. Ограничьте выбросы тяжёлых металов — и получите разные катализаторы (хотя иногда и что-то похуже). А предоставленный сам себе — так и будет всех кругом отравлять

    А вопрос «кто контролирует наши компьютеры» — это таки вопрос безопасноти, так что выбора особого-то и нет. Вопрос стоит не как «нужно ли это делать», а как «когда это делать»…
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • 0
    Ну так потрудитесь заменить в своем примере const на constyexpr и убедиться, что ничего кроме test1.cpp:21:15: error: constexpr variable 'calculated_distance' must be initialized by a constant expression constexpr int calculated_distance = distance(point(3, 5), point(7, 2));
    Вот прямо даже так? Вы таки написали distance(point(3_c, 5_c), point(7_c, 2_c));, как в моём примере, а компилятор, сволочь такая, взял и заменил 3_c на 3? Плохой у вас компилятор, негодный, что я ещё могу сказать.

    Чем срамиться — затратьте минуту времени на компиляцию.
    Вы это глядя в зеркало, я надеюсь, пишите? Потому как я-то свой пример проверил, перед тем как писать. И с const и с constexpr. Да, забыл написать изначально constexpr, каюсь. Вернее — давно покаялся, только вы на разьяснение внимания не обратили и продолжаете воевать с изобретёнными вами призраками… Уже изобретаете уже десятый, наверное, способ мой пример исковеркать так, чтобы он работать перестал.

    Конечно! Ибо в тьюториале есть… свой constexpr sqrt
    Там много чего еще есть. В частности там using namespace hana::literals; есть — как у вас константные целые без этого вообще работают, ума не приложу. Вернее знаю как — никак.

    А на С++ — да, очень легко спутать, что дает язык, что библиотека, что — компилятор. И на пустом месте — сесть в лужу.
    То что вы это сумели сделать уже раз 10, наверное, не обозначает, что это — единственный возможный вариант использования. Я вас уверяю: подход «а что это тут за пуковки, которые программу понимать мешают, дай-ка я их удалю — за ненадобностью» могут к слезам на любом языке привести.

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

    Для бригады сеньор + мидлы и юниоры — на Си производительность больше.
    От сеньоров зависит. Конечно если у вас и сеньоры C++ не знаю — беда будет, но тут, как бы, С++ ничем из общего ряда не выбивается. Кто-то в команде должен таки знать язык, на котором всё пишется. Если вы не знаете C++, но знаете Delphi — то у вас на Delphi будет быстрее, в моём случае — наоборот.

    P.S. Компилятор в руки и убеждайтесь, что вы не правы, несмотря на ваш огромный опыт. :-)
    Да легко. Но только после того, как вы мне покажите компилятор, где на строку с distance(point(3_c, 5_c), point(7_c, 2_c)); будет выдано сообщение об ошибке оных _c не вклющее и обьясняение — как вы этого добилиcь. Все известные мне компиляторы уж по всякому в сообщении об ошибке пишут строку, в которой ошибка, а не отсебятину всякую.
    Куда деваются программисты после 40
  • 0
    Хотя да, донат в ReactOS вместо оплаты монополии МС был бы намного выгоднее для общества в целом.
    Давно пора. Все современные операционки, фактически, сейчас намертво привязаны к «материнскому кораблю» и чем дельше в лес, тем больше.

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

    Если при госзакупках типажами в сотни тысяч машин поставить условие, чтобы железо было с драйверами под ReactOS — они найдутся. Кривые и китайские — но найдутся.
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • +1
    Доступностью ПО (с этим Windows рулит) или скоростью работы (тут скорее Linux), надёжностью (тут современные Маки хороши, но те же 10% пользователей были и у MacOS Classic, которая была, в этом смысле, ужасом), ценой, в конце-концов.

    Если грубо — у MacOS всегда были свои 7-8% людей, которым было достаточно «красивых кнопочек» и только в редкие моменты, когда другие OS делали что-то ужасное (Windows 8, ага) — эта доля временно повышалась…
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • 0
    На Windows это вполне логично.
    В Windows вообще много «грязи». Если хотите воспроизвести — задайте в rpath просто $ORIGIN без дополнительных уточнений. Хотя обычно полезно складывать библиотеки в подкаталог «lib», чтобы не засорять каталог с бинарниками…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • 0
    Не вижу препятствий.
    Что значит «не вижу препятствий?»

    Вы при сборке указывали rpath? А если нет — то с какого перепугу библиотеки должны искаться где-то, кроме системных каталогов?

    Соответственно, самое разумное решение — это позволить класть библиотеку рядом с пусковым файлом.
    Ну зачем же мусор-то разводить? Обычно бинарники живут в одном каталоге, библиотеки — в другом, связь — через rpath, можно указывать абсолютный путь или через $ORIGIN относительный…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • +1
    Ну так что и что там с test10.cpp:16:16: note: non-constexpr function 'sqrt' cannot be used in a constant expression return sqrt(v1 * v1 + v2 * v2);?
    А это у вас нужно спросить — это вы написали, не кто-то другой.

    Вам не кажется симптоматичным, что и DistortNeo и khim ошиблись?
    Нет, мне кажется симтоматичным что вы взяли работающий, но иллюстративый пример (где, разумеется, const легко меняется на constexpr — как уже говорилось константные целые числа дают гарантии и без явного написания constexpr), после чего «выкинули из купели ребёнка» и с увлечением начали исследовать оставшуюся в купели воду.

    Это много говорит о вас, и совсем немного — о C++.

    Как, собственно, говорилось изначально — это пример из тьюториола и в нём, разумеется, ошибок нет, всё копилируется и работает — можете сами убедиться.

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

    Так что в сухом остатке остаётся разве что ваше нежелание читать что написано собеседником, что и делает дальнейшее обсуждение бессмысленным.
    Куда деваются программисты после 40
  • 0
    Но я уже понял, что здесь как на Windows не прокатывает положить динамическую библиотеку рядом с exe
    А бинарник-то к этому готов? По умолчанию считается, что библиотека должна быть частью операционки, а не поставляться с бинарником…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • 0
    Но, честно говоря, брать чистые коды против ассемблера я бы не стал.
    Понятно что ассемблер удобнее. Но для PDP-11 действительно несложно писать в кодах. Сложение — 06, вычитание — 16, чего тут сложного? Если писать в восьмеричной системе — всё очень просто.

    Но вот кстати не думаю, что у автора оригинального Lode Runner-а были какие-то сильно отличающиеся от моих возможности — тут вы глубооооко ошибаетесь. Свой знаменитый BASIC Билл Гейтс с Алленом писали на PDP-10, а оригинальный Lode Runner — на Prime Computer 550 и VAX'е и использовались для этого вполне (по тем временам) современные FORTRAN и PASCAL.

    Да, были умельцы, которые всё делали на персоналках (тот же Мекнер), но я думаю лет через 30-40 люди будут программировать разговаривая со своим телефоном и тоже будут офигевать от того, как можно что-то было сделать на телефонах начала нулевых, когда какой-нибудь Mobile C даже системы сборки приличной не умеет. Здесь — то же самое. Все почему-то считают, что игры начались где-то в 70е с примитивнейшего Pongа в 70е. Да нифига подобного! Посмотрите на Spacewar! — одну из популярйнеших игр 60х! Люди летали по реальному оцифрванному звездному небу до того, как большинство здешних посетителей родились. А потом — потом был регресс с переходом на миникомпьютеры и ещё раз — при мереходе на персоналки и приставки… скоро мы переживём очередной раз подобное с переходом на телефоны…
    Клонирование игры Lode Runner с первого ПК в СССР «БК-0010» плюс несколько слов о программировании игр в конце 80-х
  • +4
    Apple уже показала нам важность дизайна :)
    Неа. Apple показало, что среди населения есть ~10% людей, для которых дизайн важнее всего остального. Вот только эти 10% уже купили Apple — и им ваш ReactOS не нужен в принципе…
    ReactOS версус Windows XP SP3: эпическая битва в 3DMark
  • 0
    К тому же уровень входа большой а отрасль в упадке
    Это скорее ускорит переход, чем замедлит. Когда в отрасли и так всё «прёт» выживают все — всегда всё можно «залить деньгами». Когда кризис — те, кому удаётся получить экономию без потери качества — очень быстро «выдавливают» всех конкурентов. Просто потому что в такие времена те, кто через «уровень входа» не перескочил — первые кандидаты на банкротство.

    Вот разработать что-то кардинально новое в такие моменты сложно (венчурный капитал «высыхает»), а внедрение — как раз на ура идёт.
    BIM: как мы строим строителей на стройке
  • +1
    нет, x64 — это Itanium, которую сам интел называет IA-64.
    Таки да. Это, правда, изобретение Microsoft, которому нужно было придумать как «это» назвать не использовав ни вариант Intel'а, ни вариант AMD, но таки x64 — это то же самое, что и x86-64.
    Особенности миграции c RISC на х86 в России: теперь нас держит старый банковский софт времён DOS и Netware
  • 0
    Японцы, как всегда, впереди планеты всей. А остальные пока тормозят, да…
    О чем всегда стоит помнить при локализации веб-сайта, чтобы потом не было стыдно