1. C++ / Говнокод #20220

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    template<typename T>
    T* sanitize(T* p)
    {
        return reinterpret_cast<T*>(
          reinterpret_cast<uintptr_t>(p) & ~(alignof(T)-1));
    }
    
    template<typename T>
    constexpr size_t avaliable_width()
    {
      	switch(alignof(T))
        {
          case 1: return 0;
          case 2: return 1;
          case 4: return 2;
          case 8: return 3;
          case 16: return 4;
          case 32: return 5;
          case 64: return 6;
          case 128: return 7;
          case 256: return 8;
          default: return 0;
        }
    }
    
    template<size_t bit, typename T>
    T* set_tag(T* p, bool tagged = true)
    {
      	static_assert(bit < avaliable_width<T>(), "bad_width");
    
    	if(tagged) {
         	return reinterpret_cast<T*>(
            	reinterpret_cast<uintptr_t>(p) | 1 << bit); 
        }
      	return reinterpret_cast<T*>(
          	reinterpret_cast<uintptr_t>(p) & ~(uintptr_t(1) << bit));
    }
    
    template<size_t bit, typename T>
    bool get_tag(T* p)
    {
      	static_assert(bit < avaliable_width<T>(), "bad_width");
      	return reinterpret_cast<uintptr_t>(p) >> bit & 1;
    }

    Младшие биты указателей на выравненные типы всегда нулевые. Из за этого (по формуле Шеннона) указатель несёт в себе меньше информации, оставаясь того же размера. Битоёбов это расстраивает.

    Запостил: Soul_re@ver, 16 Июня 2016

    Комментарии (204) RSS

    • Хранить счетчик в одном слове с указателем - это же классика локфри-задротства. Типа костыль от ABA-проблемы.
      Еще в красно-черном дереве цвет можно хранить в указателе (boost::container::map).
      Ответить
      • Если бы это было внутри какой-то либы и не торчало кишками наружу, я бы это не выкладывал. Так нет, это местные деятели избавлялись от лишних параметров — битовой маски, размазав её по остальным параметрам. В итоге в одной функции первые два бита в одном параметре, вторые два в другом, а в другой — три бита в одном, и последний в другой.
        Ответить
        • > в одной функции первые два бита в одном параметре, вторые два в другом, а в другой — три бита в одном, и последний в другой.
          ЛОЛ! Премию "битоёбы года" им!
          Ответить
          • Его указатель был разработан настолько, что он мог спрятать в нём целых три бита...
            Ответить
            • > Его указатель был разработан настолько, что он мог спрятать в нём целых три бита...
              Зато у него был тяжелый день. У него каждый день был тяжелый...
              Ответить
        • Царское решение.
          А теперь расскажи им что в 99.9% в x64 указателе половина старших бит простаивает.
          Ответить
          • согласно закону мура, близжайшие лет 25 старшие три бита 64-разрядного указателя будут простаивать. Исключая битоебов офк
            Ответить
    • emplate<typename T>
      constexpr size_t avaliable_width()
      {
        	switch(alignof(T))
          {
            case 1: return 0;
            case 2: return 1;
            case 4: return 2;
            case 8: return 3;
            case 16: return 4;
            case 32: return 5;
            case 64: return 6;
            case 128: return 7;
            case 256: return 8;
            default: return 0;
          }
      }

      Битоеб бы такой хуйни не сделал. Он бы через сдвиги замутил
      Ответить
      • constexpr же, какая разница? Да и юзается только для ассёрта.
        Ответить
        • > constexpr же, какая разница?

          Компилироваться будет дольше.

          Сортировка пузырьком в constexpr считается намного дольше, чем если скомпилировать и запустить
          Ответить
          • зато считается один раз за время жизни программы
            Ответить
      • А как посчитать логарифм через сдвиги?
        Ответить
        • Да тут и не надо считать логарифм. Просто переформулировать функцию, в духе is_bit_available<T>(bit).
          Ответить
          • Не просто is_bit_available а чтоб там был всего 1 бит зажжен. Ну типа делаем стравнение if(alignof(T) == (1<< x)) return x; где x перебираем от 0 до 8 циклом for
            Ответить
            • Нахуй тут логарифмы? Задача же вполне конкретная - проверить в компайлтайме, влезет ли бит в свободное место в указателе:
              template <size_t bit, typename T>
              constexpr bool is_bit_available()
              {
                  return (1 << bit) < alignof(T);
              }
              
              static_assert(is_bit_available<bit, T>(), "bad_width");
              Ответить
        • > А как посчитать логарифм через сдвиги?
          Там же по сути степень двойки надо посчитать, её и сдвигами можно...
          #include <iostream>
          #include <typeinfo>
          
          constexpr size_t pow_of_2(size_t n, size_t pow) {
              return (n == 0) ? 0 : ((n == 1) ? pow : pow_of_2(n >> 1, pow + 1));
          }
          template <class T>
          constexpr size_t width() {
              return pow_of_2(alignof(T), 0);
          }
          
          template <class T>
          struct ensure_compile_time {
              static const size_t value = width<T>();
          };
          
          template <class T>
          void display() {
              std::cout << typeid(T).name()
                        << ": size = " << sizeof(T)
                        << ", width = "
                        << ensure_compile_time<T>::value << "\n";
          }
          
          int main() {
              display<char>();
              display<short>();
              display<int>();
              display<long>();
              display<long long>();
              display<char*>();
              display<size_t>();
              display<double>();
              return 0;
          }

          c: size = 1, width = 0
          s: size = 2, width = 1
          i: size = 4, width = 2
          l: size = 8, width = 3
          x: size = 8, width = 3
          Pc: size = 8, width = 3
          m: size = 8, width = 3
          d: size = 8, width = 3
          Ответить
      • Специализацией типа на alignof. Быстрее свича
        Ответить
    • > Младшие биты указателей на выравненные типы всегда нулевые.
      > всегда
      Ой ли...
      Ответить
      • Когда встречается два подобных далбоеба - не всегда))
        Ответить
    • > Битоёбов это расстраивает.

      Есть пара классических алгоритмов - те же красно-черные деревья - которым помимо указателя на данные, нужно только 1-2 бита дополнительной информации.

      На 64бите, если у тебя структура содержит указатель (классическое бинарное дерево: только указатели) то ее размер будет выровнен на 8 байт. Добавление одно-байтового поля, из-за паддинга, приведет к потере семи байт. Если у тебя инстанций структур миллионы, то это уже очень сильно ощутимая трата памяти.

      Вот поэтому и трахаются.
      Ответить
      • Пусть свои деревья поверх массива аллоцируют с индексацией через 256. Ну т.е. если дерево то делаем массивчик на 256 из структур, в которых два uint8_t это лево и право, и погнали
        Ответить
        • > Пусть свои деревья поверх массива аллоцируют с индексацией через 256

          пробовал - медленнее. так получается двойное разыменовывание указателей. плюс данные смежные в разных местах памяти лежат, что ухудшает cache footprint.
          Ответить
          • Может я туплю, но откуда там взяться двойному разыменованию указателей? На каждый "шаг" в дереве происходит лишь одно разыменование:

            http://melpon.org/wandbox/permlink/vrwfBc7NzxIcd33R
            Ответить
            • я тебя не правильно понял. в твоем случае, дерево ограничено 256 (255?) элементами. что бы убрать этот лимит - под-деревья либо что-то типа radix tree или burst tree. и там все еще хухе.

              я думал что бы просто индексы/указатели в нечто типа radix tree заворачиваешь.
              Ответить
              • Ну можно заменить uint8_t на uint16_t. Этого хватит для большинства разумных применений?
                Ответить
                • большиниству разумных применений это по барабану.

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

        Даже если обернуть это всё в какой-нибудь tagged_pointer<T> без неявного преобразования в указатель, будет намного безопаснее. По крайней мере, случайно выпустить похереный указатель в другие части программы и распидорасить память сложнее станет.
        Ответить
        • > Но в таких случаях весь геморрой либо спрятан в дебрях алгоритма, либо надёжно заинкапсулирован в классе.

          как если бы от вас мудаков было так просто что-то спрятать.
          Ответить
    • Круто по таким битам во множестве параметров размазать ещё один указатель.
      Ответить
      • прикладная стеганография
        Ответить
        • А я вот видел как чувак в битмап прятал данные. Снаружи данные не видно, обычная фотка с айфончика ловрез мыльная
          Ответить
          • > в битмап
            Для чпегов поинтересней методы есть, когда по бесполезным частотам размазывают данные. Оно даже некоторые не слишком сильные трансформации может пережить...
            Ответить
            • Тайная депеша шакальей почтой.
              Ответить
              • вот вы смеетесь, а уже много раз юзалось спецслужбами
                Ответить
            • не очень способ: по этим же бесполезным частотам оно и вычисляется
              Ответить
              • > вычисляется
                Подозревается же... Ну и чем меньше упихано данных - тем меньше это отличается просто от хуёвого компрессора...

                Его jpg был разработан настолько, что он мог спрятать в нём википедию.
                Ответить
                • > Подозревается же
                  А если это псевдослучайный выхлоп какого-нибудь AES, как его можно обнаружить?
                  Ответить
                  • Обнаружить можно только если сравнить с оригиналом. Именно поэтому для стеганографии надо делать свежую фотку и после обработки сразу удалять оригинал...

                    А по неестественному частотному спектру или другим характеристикам можно заподозрить, что там что-то спрятано.

                    З.Ы. Надо кота завести, чтобы стеганограммы постить на инстаграм :3
                    Ответить
                    • Инстаграм сильно пережимает джипег (не помню, сколько по шкале ебучести шакалов, но иногда заметно), так что нужно сильно постараться, чтобы он не уничтожил стеганографическую информацию. Ещё он ограничивает размер до 612×612 и делает превьюшки 306×306 и 150×150 (да, 612 не делится нацело на 150).

                      С прошлого года Инстаграм стал поддерживать загрузку PNG, а также загрузку картинок, выходящих за габариты 612×612, но есть риск, что зрители с ARMv6 на борту такого котика не увидят, потому что последняя версия для такого говна мамонта (а именно 4.2.x, вышедшая три года назад) эти новшества не поддерживает.
                      Ответить
                    • Если надо что-то распространить, то лучше постить в Твиттор, ибо в нём есть ретвит, а в Инстаграме нет.

                      Сторонние программы для «репоста» в Инстаграме во внимание не берём, ибо этими костылями пользуются редко, к тому же они портят картинки.

                      Ещё можно во Вконтакте поучаствовать в так называемом лайктайме — это когда твою фотку репостят в группу и куча случайных зрителей ставит лайки в надежде, что за активность их примут в лайктайм и они тоже соберут лайки.

                      Наконец, можно что-нибудь склепать для Пикабу, Джойреактора, Яплакал и прочих фишек. Есть шанс, что картинка заслужит бессмертие и первоначальный автор затеряется.
                      Ответить
                    • > Обнаружить можно только если сравнить с оригиналом
                      нет
                      стеганография искажает спектр изображения, и это можно детектировать статистически
                      JSteg вообще _очень_ характерный паттерн даёт, F5 чуть менее очевиден, но тоже я видел статьи и про его стеганализ
                      Ответить
      • А чё, халявный указатель на каждые 15 (если 32-битная платформа и выравнивание на 4 байта)...
        Ответить
      • Можно туда ещё какой-нибудь код коррекции засунуть.

        Redundant Array of Independent Pointers
        Ответить
        • Давай в коде напиши. Не понял что-ты хочешь сделать. Свой вектор, специализированный на хранение умных и глупых указателей, чтоб там каждый 256 значений хранить ещё один поинтер?
          Ответить
          • Ну вон vxwxv жалуется, что кто-то может запороть любой кусок памяти. А мы в ответ будем группы указателей объединять в RAIP, чтобы можно было детектить и/или исправлять ошибки в них :)

            В 15 указателях как раз накопится достаточно битов на восстановление одного из них (если знаешь, какой помялся)... Но надо больше, чтобы задетектить какой именно убит...
            Ответить
            • Можно портировать код Рида-Соломона с компакт-дисков.
              Ответить
      • Офтопик: В штрихкоде ΕΑΝ-13 полоски только для двенадцати цифр (со 2-й по 13-ю). Первая цифра размазана по шести, следующим за ней (по первой половине штрихкода): если какой-то бит первой цифры установлен в единицу, то отпечаток цифры, на которую он накладывается, инвертируется.

        Экономия места на упаковке: 12 знакомест вместо 13. Прирост пирфоманса ≈ 8%.

        С тем же успехом могли бы загнать и 14-ю цифру, размазав её по цифрам с 8-й по 13-ю. А нет, тогда же переворачивать упаковку вверх ногами будет нельзя.

        https://ru.wikipedia.org/wiki/European_Article_Number
        Ответить
        • И три шестерки в начале середине и конце приносящие профит в жертву сатане.
          Ответить
          • Про три шестёрки миф. Красивый, но миф.

            У цифры ширина в шесть условных пикселей, у разделительной полосы — в четыре. Да, у разделительной полосы первые четыре пикселя совпали с шестёркой (чёрный, белый, чёрный, белый), но у шестёрки потом идут ещё два белых пикселя, а только потом следующий знак. То есть разработчики сэкономили два пикселя после первой разделительной полосы и ещё два после второй (считать место после третьей полосы бессмысленно), итого 4 пикселя, т. е. 2/3 цифры.

            Да, мало того, что одну цифру размазали по шести, так ещё и на разделительных полосках сэкономили 2/3 знакоместа. Представьте, если бы в сишке точка с запятой занимала не байт, а полбайта, сколько места было бы сэкономлено!
            Ответить
            • >первые четыре пикселя совпали с шестёркой (чёрный, белый, чёрный, белый), но у шестёрки потом идут ещё два белых пикселя
              >два пикселя после первой разделительной полосы и ещё два после второй (считать место после третьей полосы бессмысленно), итого 4 пикселя, т. е. 2/3 цифры.
              >в сишке точка с запятой занимала не байт, а полбайта

              Я читаю этот пост, я не могу понять смысл, но явно вижу вореции. И зожатие, и циферки, и стиль.
              Ответить
              • Напишем проще.
                Левый защитный шаблон	     101		
                Средний защитный шаблон	    01010	
                Правый защитный шаблон	     101
                6 в правом поле              1010000
                6 в левом поле               0101111
                6 в левом поле, негатив  0000101

                Без широкого белого пространства справа или слева двойная тонкая полоска — это защитный шаблон, а не шестёрка.

                P.S. Опять похоже на вореции из-за обилия цифр.
                Ответить
                • > Опять похоже на вореции из-за обилия цифр.
                  Не. Тут понятнее. Плюс вчера время было очень позднее.

                  >6 в левом поле 0101111
                  Вот эта штука ломает всю легенду.
                  Ответить
                  • Сволочи! Если бы R-код был не 1010000, а, например, 1100110, то L-код получился бы 0011001. А чёрт, всё равно не получается: одна полоска тоньше.

                    Семь пополам не делится, поэтому в негативе полоски по-любому будут другой толщины.
                    Ответить
        • >Экономия места на упаковке: 12 знакомест вместо 13. Прирост пирфоманса ≈ 8%.
          Эх. Там же помехозаshitный оверхед просто пиздейший

          95 полосок = 95 бит. Если грубо говоря 10 бит ≈ 3 десятичных разряда.
          То 90 бит ≈ 27 десятичных цифр. А хранятся всего 12.
          Ответить
          • Или уберём полоски защитных шаблонов.

            7 бит на каждую цифру. Сёмь!
            В 7 бит не 10 значений влезет, а все 128.
            То-есть, опять таки джвухкратная перепитушня.
            Ответить
            • Там все семь битов не используются: один крайний бит всегда установлен, другой крайний — всегда сброшен. Это нужно для калибровки сканера.

              Итого лишь 5 активных битов, в которые влезает 32 значения. Но всё равно перепитушня.
              Ответить
            • P.S. И всё-таки похоже, что четырнадцатую цифру можно запихнуть в ΕΑΝ-13 без заметной переделки: для этого и в правой половине разрешить использовать негативные шаблоны.
              Ответить
          • Да походу просто уже был стандарт, уже была куча сканеров, которые читают 12 цифр и работают только на фиксированном количестве полосок... И вдруг встала задача, добавить 13-ю... Вот и выебнулись, чтобы совместимость не рушить.
            Ответить
            • The International Article Number (EAN) (also known as European Article Number, which technically refers to EAN-13) is a 13-digit barcode symbology, which is a superset of the original 12-digit Universal Product Code (UPC)

              Ч.Т.Д.
              Ответить
    • >Младшие биты указателей на выравненные типы всегда нулевые.
      >Битоёбов это расстраивает.
      -XX:+UseCompressedOops
      Ответить
      • Блин, оно ещё и по-умолчанию включено.
        Ответить
        • А что плохого-то?
          Вообще никогда не понимал этих криков про 4Gb - потолок 32битных процессоров.
          Какого хера? Если минимально адресуемая единица памяти - байт. Байт, блеать!

          8*(2**32)=32 Gb. Не встечал в своей практике полезных десктопных приложений, которым нужно даже 4гига.

          А тут джва указателя по цене одного. 64битные указатели просто ненужны.
          Ответить
          • сервера ж еще есть
            Ответить
          • > 32 Gb
            Как будто это много.
            Ответить
            • Для реальных инженерных задач вроде моделирования сложных конструкций методом конечных элементов и 32 Gb покажется каплей в море...
              Ответить
              • Держим в лабе несколько машин с 96+, чтобы нашу химию считать.
                Ответить
            • У альтеровского синтезатора в системных требованиях вообще 48 написано (для топовых FPGA, для самых простых и 4-8 хватит)...
              Ответить
            • top вычислительной машины с которой был написан этот пост в студию!
              Плюсаторы тоже пусть не стесняются
              Ответить
              • дома у меня 16, на работе 32 и все равно не хватает
                Ответить
              • Как раз вчера рестартил файрфокс выжравший 3.7 гб кстати. И это всего-лишь программа для просмотра котиков на ютубе. Что говорить про матлаб или фотошоп.
                Ответить
                • матлаб меньше потребляет. не надо.

                  если ничего не делать
                  Ответить
                • имеет обыкновение течь не сам фф обычно, а септик флешплеер
                  Ответить
                  • Флешплеер вынесен в plugin_container.exe же.
                    Ответить
                    • Флеш не нужен, как и ты
                      Ответить
                      • Мамка твоя на панели зато очень нужна.
                        Ответить
                        • >Мамка твоя на панели зато очень нужна.

                          Тебе там тоскливо одному, 3_14dar?
                          Ответить
          • > Не встечал в своей практике полезных десктопных приложений, которым нужно даже 4гига.

            графика и видео (расход памяти растет квадратично с разрешением).

            встроеные базы (сессия, конфигурация, данные; версионирование оных).

            (компиляция/оптимизация?)

            (ну и математика, конечно, хотя оно не так сильно десктопно, но: excel & friends.)

            есть много применений для большого количества памяти. 64 адреса - это шаг в этом направлении. можно кучи херни кэшировать, но на текущий момент, из-за ограничения памяти, приходится вычислять/с диска/сети тянуть.
            Ответить
            • >графика и видео (расход памяти растет квадратично с разрешением).
              3Д давно считают на специализированных серверах и фермах. Энкодинг и просмотр даже 4К не требует запредельных количеств памяти.

              >встроеные базы (сессия, конфигурация, данные; версионирование оных).
              Зачем большие БД тащить на десктоп. Всякие sqllite иже с ними не требуют так много памяти.

              >(компиляция/оптимизация?)
              Надо проектировать языки с LL(1). И поменьше лепить крестошаблонов в компайл-тайме.
              При этом даже компиляция монстров вроде FF требует около 3-4 гиг памяти. Случай, скажем таки исключительный.

              >excel
              Ну прям 4 гигабайта?

              >есть много применений для большого количества памяти. 64 адреса - это шаг в этом направлении.
              Да. Только 95% программ по прежнему с головой хватает 4гиг.
              Ответить
              • > Зачем большие БД тащить на десктоп. Всякие sqllite иже с ними не требуют так много памяти.
                А когда будет тормозить, периодичнски портить базу и вообще окажется, что это безфункциональное днище, то конечно же возьмешь нормальную бд, но зачем было жрать кактус?

                > Надо проектировать языки с LL(1).
                Ты хоть раз то это делал? Там обычную вычислялку выражений то нормально не напишешь. Вместо дерева выражения оно тебе построит днище, а ты из него должен будешь получить нормальное дерево с правильными приоритетами и ассоциативностью и порядком исполнения операций. Только парсер с откатами. Только с возможностью задать приоритеты.
                Ответить
                • >Ты хоть раз то это делал?
                  Да, пилил. LISP — это просто суть LL(1). Они созданы друг для друга.

                  >Там обычную вычислялку выражений то нормально не напишешь.
                  Польская нотация — твой друг. Даже школьник осилит вычислялку выражений.

                  >Ты хоть раз то это делал?
                  Нет, не своё Г проектировал.

                  >2016
                  >сперва добейся
                  Ответить
                  • > Да, пилил. LISP — это просто суть LL(1). Они созданы друг для друга.
                    Лол, да. Но LispGovno.

                    > Польская нотация — твой друг
                    Лол, да, но она как и лисп не нужна

                    > Нет, не своё Г проектировал.
                    Чужое г?

                    > сперва добейся
                    Да я не об этом
                    Я просто пояснил, что для нормальных применений не пригодно
                    Ответить
                    • >> Польская нотация — твой друг
                      > Лол, да, но она как и лисп не нужна
                      Почему? Есть какие-то строгие аргументы и исследования (скажем, опыты над изучающими математику, которых обучили только одной нотации и изолировали ото всех, использующих другую), поддерживающие инфиксную нотацию? Или инфиксная питушня - дело привычки, исторически сложившийся ненужный бред?
                      Если что, я голосую за инфиксную нотацию и сишкоподобный синтаксис, высказывался в пользу них здесь ранее, но у меня нет ни одного аргумента кроме тех, что сводятся к "я так привык".
                      Ответить
                      • так вот если все так привыкли это самая веская причина ничего не менять. Зато не вижу причин ради экономии тактов переучивать весь мир, приводя производительность людей к деградации. с ними все намного сложнее чем с компами.
                        Ответить
                        • А что... Законы издали, ъъъ из типографий из'яли, учебники переписали - через пару поколений всем до лампочки. А то так иначе и будем с этим антипирфомансным питухом тонуть, если оставим все эти футы, дюймы и плохопахнущиепарсящиеся нотации.
                          Ответить
                          • И еще один луддит. Уже сейчас почти пофиг на инфиксную или префиксную\постфиксную нотацию. Сейчас тормозит из-за плохого перформанса человеческого кодирования (а именно из-за этапа оптимизации), шаблонов и контекстных зависимостей, тк кучу питушни генерировать и держать в памяти надо.

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

                            Нечего перекладывать работу машин на людей. Темболее ту, что почти не имеет последствий по сравнению с другими этапами.
                            Ответить
                      • > Или инфиксная питушня - дело привычки, исторически сложившийся ненужный бред?
                        Я, Xom94ok, находясь в здравом уме и твердой памяти, торжественно заявляю:
                        + - * / 1 2 3 4 5
                        идет напитон по причине нечитабельности. Скобки
                        (+ (- (* (/ 1 2) 3) 4) 5)
                        не помогают. Этот минус относится к той пятёрке?
                        Разнести выражение по строкам не вышло, монитор распидорасило по вертикали, да так, что пришлось новый мятный нексус покупать и с него писать, а так - парсер строить легко, да.
                        Ответить
                        • > Скобки
                          > (+ (- (* (/ 1 2) 3) 4) 5)
                          > не помогают.

                          Сравним:
                          Add(Sub(Mul(Div(1, 2), 3), 4), 5)

                          Так лучше?
                          Ответить
                          • Может ты из тех, кто советует делать так:
                            #define begin {
                            #define end }
                            Не, дружище, я читать такую питушню не хочу и потомкам читать ее не желаю
                            Ответить
                            • Короче лл1 и польская нотация для неосиляторов нормальных грамматик или не умеющих писать нормальные компиляторы. Даже во времена бейсиков инфиксную нотацию осиливали и при 64кб рам ниче не тормозило. Вопрос считаю закрытым
                              Ответить
                              • >Короче лл1 и польская нотация для неосиляторов нормальных грамматик или не умеющих писать нормальные компиляторы.
                                >Даже во времена бейсиков инфиксную нотацию осиливали и при 64кб рам ниче не тормозило.

                                Блять, мне за тебя стыдно. Именно за воинствующее неосиляторство.
                                LL(1) и польская нотация вещи ортогональные. Паскаль тому подтверждение.
                                В этом проблема, что бейсик в 64кб не тормозили, а буст с крестам, 4х ядерным процом и 8Gb сука тормозит.
                                Ответить
                          • Свежего(Как(Лучше(Стало(спасибо, большое), гораздо), почти), глоток), воздуха)
                            Ответить
                          • Это в таком порядке LL(1) парсер будет генерировать выхлоп.
                            А парсить он может и привычный инфикс.
                            Ответить
                            • Финская война

                              — Товарищ! Товарищ!
                              — Бляяя, заебаал, блядь!
                              — Как развился, товарищ? Продался западу наверное? Товарищ...
                              — Ёб твою мать, блядь, иди отсюда нахуй, блядь!
                              — Что, что случилося-то?
                              — Ты чё, вторгся что ли, мудак, блядь?!
                              — Не, я не нападал. Я тебе коммунизма принес!
                              — Сука, блядь, пидорас, блядь! Хули ты сделал, ты чё, мудак что ли совсем, блядь?!
                              — Что ты! Я коммунизма тебе!..
                              — Блядь, всё-таки напал, ой мудель, блядь!.. Твою мать, убери эти войска нахуй отсюда, блядь! Сейчас будешь всё это выводить, блядь!
                              — Я тебе принес коммунизма-то!
                              — Чё ты мне коммунизма принёс, чё ты, мудак, что ли бля?! Хули ты вымазл… хули ты пропагандой-то вымазался, мудак, блядь?!
                              — Я уж начал строить, я тебе…
                              — Пидорас, блядь! Сука, блядь!
                              — Товарищ, ты что!
                              — Убери это говно отсюда, блядь!
                              — Я начал строить уже!..
                              — Ёб твою мать, блядь, и всю Карелию захватил, блядь!
                              — Хотел тебе построить-то!..
                              — Мудак, блядь, ну ты мудак, блядь, я тебя сейчас убью, нахуй! Я тебя, блядь, сейчас убью нахуй, блядь!
                              — Я тебе принес коммунизма-то!..
                              — Блядь, ну ты пидорас, блядь…
                              — Коммунизма-то…
                              — Бля, ну ты тоталитарный, ёб твою мать, а…
                              — Коммунизма-то…
                              — Бля, с кем меня на границе посадили, охуеть, ёбаный в рот!..
                              — Я не нападал, я тебе честно говорю! Я тебе… я просто хотел тебе сделать доброе дело…
                              — Чё?
                              — Я не нападал вообще сегодня!..
                              — Чё, нахуй, мне — добро?
                              — Я хотел тебе…
                              — Какое доброе дело? Ты понимаешь, что ты захватил, бля, полуостров, единственный полуостров. Единственный, блядь, полуостров, мы на нём живём. Живём на полуострове, а ты его захватил. Чё… где мы теперь жить будем, где, а?!
                              — Хотел тебе доброе дело!..
                              — Где я жить теперь буду?! Хуль ты пропагандой вымазался, что теперь это читать буду?!
                              — Я не нападал, просто провокационные артобстрелы!..
                              — Границу от Ленинграда убрать что ли?! Я тебя сейчас уберу!
                              Ответить
                              • "brutushafens,hometwo,s-a--m,hometwo,Mobac,Talbin,hinter,botbatbotb atbot,kargoudn,xavij,KonardinoHuyardino, trololololo,FUCK_ASS,xyilka,Konardo,Hors e3,stretor,Igor_Gandonov,Horse2,Stertor, PragramistOtBoga,angrybird,Copy-Paste,TarasChlenodevka,Anal,Pedofil,Ushl epok,Uebok,Copy-Paste,anonimb84a2f6fd141,Pediastr,alexoy ,lohpider,uiopqwertyasd,3oJloTou_xyu,d_f omenok,3_14dar"
                                Ответить
                                • С - сверхдержава

                                  За чёрствым хлебом в воронежских сёлах выстраиваются в очередь
                                  https://www.youtube.com/watch?v=2u6tjvwp_Mo

                                  В коментах:

                                  Добрыня Никитич6 дней назад
                                  путин мразь

                                  thealphazoid5 дней назад
                                  а коллективный путин - это 140 млн мразей

                                  Oleg Oleg6 дней назад
                                  блядский обама ,что творит сука!!!!!

                                  Сергей Тарасов5 дней назад
                                  Если бы этот сюжет вдруг показал телеканал "Дождь"-его бы патриоты с говном сожрали. А тут-ничего,нормально.

                                  Александр Квитин4 дня назад
                                  у вас есть сыр "Дор Блю"?
                                  -Что за сыр такой?
                                  -Ну это тот,который с синей плесенью.
                                  -Нет .Сыра нет.Есть хлеб "Дор Блю" и колбаса "Дор Блю"

                                  Ляля Наивная4 дня назад
                                  блядство, по совести- вешаться нужно управленцам хуевым, 40% мировых запасов полезных ископаемых в стране а они олимпиады по 50 000 000 000 долларов закатывают а старики плесень жрут, как скотина.

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

                                  Понихейтер Епифанцев9 часов назад
                                  В деревнях ели всё этот самый мой хлеб ели!
                                  Ответить
                                  • >>бред. наивный бред?
                                    если что, ко-ко-ко ко-ко-ко я голосую , слился как животное, маздайка за инфиксную нотации, анскильное говно , питух, иди кукарекай, потому что удобнее.

                                    для хранение , Сишка, проектов и , Сишка, сессий, и на больших анскилед проекте среднего заедушный , животное, размера не пробовал. 8-12гб жрет столько парсер с откатами. питушня только ты питух, возможностью задать

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

                                    redundant днище array of слился ты животное, independent code штеуд shared libraries много применил анскильных функций жрет столько 1-2 бита дополнительно, слился как животное, днище. 64 питушня анскильная кукарекалка - это шаг говно в этом направленцам анскильная кукарекалка хуевым, 40% , животное, мировых запасов полезным частотам оно и питушара анскильная в африке дерево.
                                    Ответить
                                • HuyardinoBalkariya
                                  Ответить
                      • >Если что, я голосую за инфиксную нотацию и сишкоподобный синтаксис, высказывался в пользу них здесь ранее, но у меня нет ни одного аргумента кроме тех, что сводятся к "я так привык".

                        Это вообще ортогонально.
                        Классический пример. В паскале сиалголоподобный синтаксис. И в си алголоподобный синтаксис. Только тип перед переменной/функцией. Виртовские компилеры LL(1)

                        Также я где-то видел как для Go и Rustа пилили LL(1) горматики.
                        Просто для лишпа это вообще тривиально.
                        Ответить
                        • Юзать для инфиксных выражений лл1 можно, только это не добавит производительности, тк полученное дерево выражений надо будет дико перепилить. Короче ты не знаешь о чем говоришь. Дерево выражений получится, но будет не верным не пригодным для расчётов и нужна нехилая пост обработка.
                          Ответить
                          • >Дерево выражений получится, но будет не верным не пригодным для расчётов и нужна нехилая пост обработка
                            >только это не добавит производительности,
                            Нормальным оно будет. Преимущество LL(1) в том что можно парсить поток на лету.
                            Как это делает SAX парсер.

                            >но будет не верным
                            Это вообще абсурд.

                            >тк полученное дерево выражений надо будет дико перепилить
                            Бляяя. Дерево, оно и в африке дерево. Его не надо перепиливать.
                            Просто по мере получения инфы от парсера ты инсертишь в нужный парент и получаешь произвольное дерево.

                            Однако повторюсь: дерево зачастую вообще не нужно. Благодаря LL(1) расчёты выражений можно выполнять на лету.
                            > не пригодным для расчётов
                            Ага. Рассказывай еще.
                            Add(Sub(Mul(Div(1, 2), 3), 4), 5)

                            Единственная невыдуманная проблема LL(1) — левая рекурсия. Но ты о ней даже не упомянул.
                            Ответить
                            • Балка, не распарсив инфиксное выражение до конца - ты не знаешь что и куда вставлять
                              Ответить
                              • Из дерева ты сразу высираешь своеобразный байт-код для интерпретатора.
                                У тебя есть джва вореанта в что преобразовывать инфикс: по сути это лишп или форт.

                                Польская (обратная) нотация — самое удобное промежуточное представление.
                                Как только ты её получаешь, дальше тупо итерируешь и интерпретируешь выражение посредством стековой машины. Всё.
                                Арность операторов известна и фиксирована — 2. Встретил 2 числа — применил функцию.

                                Но конечно ты не знаешь про удобство бесскобочной (польской) нотации, потому начал кукарекать про «НИНУЖНА», «НЕХИЛАЯ ПОСТ ОБРАБОТКА», «ПЕРЕПИЛИТЬ ДЕРЕВО».

                                >ты не знаешь что и куда вставлять
                                Вставляй в джва стека.
                                Ответить
                                • С - сверхдержава

                                  За чёрствым хлебом в воронежских сёлах выстраиваются в очередь
                                  https://www.youtube.com/watch?v=2u6tjvwp_Mo

                                  В коментах:

                                  Добрыня Никитич6 дней назад
                                  путин мразь

                                  thealphazoid5 дней назад
                                  а коллективный путин - это 140 млн мразей

                                  Oleg Oleg6 дней назад
                                  блядский обама ,что творит сука!!!!!

                                  Сергей Тарасов5 дней назад
                                  Если бы этот сюжет вдруг показал телеканал "Дождь"-его бы патриоты с говном сожрали. А тут-ничего,нормально.

                                  Александр Квитин4 дня назад
                                  у вас есть сыр "Дор Блю"?
                                  -Что за сыр такой?
                                  -Ну это тот,который с синей плесенью.
                                  -Нет .Сыра нет.Есть хлеб "Дор Блю" и колбаса "Дор Блю"

                                  Ляля Наивная4 дня назад
                                  блядство, по совести- вешаться нужно управленцам хуевым, 40% мировых запасов полезных ископаемых в стране а они олимпиады по 50 000 000 000 долларов закатывают а старики плесень жрут, как скотина.

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

                                  Понихейтер Епифанцев9 часов назад
                                  В деревнях ели всё этот самый мой хлеб ели!
                                  Ответить
                                  • >дерево питушня выражение до конца , Сишка, - ты не бездарный питух знаешь что , питух, иди кукарекай, и куда Царь тебе питушку вставлять из дерева глупая лалка выражений надо будет хрень дико перепилить дерево».

                                    >ты хоть раз говноязык то это ко-ко-ко делают сами фреймворки, ко-ко-ко на правах говно дополнительности. скобки
                                    (+ (- тебе питушку (* (/ 1 2) 3) днище 4) 5)
                                    не помогают. питушарский этот минус хрень относится к той питушня пятёрке?
                                    разнести выражения оно хрень тебе построить-то!..
                                    — мудак, маздайка говноязык блядь?!
                                    — не, я не питушня напишешь.
                                    польская анскильная кукарекалка для ко-ко-ко неосиляторов Царь компиляция монстров маздайка вроде ff требует запредельных заедушных количеств памяти.

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

                                    автопересчета, а ,я Царь, лалка, ты про Царь что? это типа ты питух, мой вопрос считаю заедушный закрытым >короче лл1 и польская нотация тебе питушку тебе питушку нинужна. так анскильное говно я писал, что анскильное говно питушарский инфик рая питушня нотацию и , днище галимое, сишкоподобный синтаксис. заедушный и в говноязык я тут Царь си алголоподобный синтаксис. и говноязык в си алголоподобный синтак , питух, иди кукарекай, питушара анскильная
                                    Ответить
                                    • > (+ (- тебе питушку (* (/ 1 2) 3) днище 4) 5)
                                      Царский лисп
                                      Ответить
                                • Вот ты сейчас про байт-код, а кому-то надо просто язык транслировать. Зачем заводить промежуточный баткод? Ну а так да, с промежуточной инфиксной нотацией и правда может взлететь.
                                  Признаю поражение по конкретно этому вопросу
                                  Ответить
                                  • >Признаю поражение по конкретно этому вопросу
                                    Вот негодяй! Я уже пример начал пилить.
                                    Ответить
                                    • Выкладывай потом на гк. Вместе посиеемся. А так то да, реально негодяй. Петушился петушился...
                                      Ответить
                                      • Мне кстати стало интересно а можно ли в произвольном языке с структурами и функциями строить вместо синтаксического дерева на всю программу синтаксическую польскую нотацию в стеке.?
                                        Ответить
                                        • >а можно ли в произвольном языке с структурами и функциями строить вместо синтаксического дерева на всю программу синтаксическую польскую нотацию в стеке.?

                                          Я ж говорю: фактически выходит конвертер в лишп/форт.
                                          Проблема в термине "произвольный язык". Типичное алголоподобное гавно типа явы и так хуярится в стековую машину.
                                          Думаю можно, только ссылки функции саму на себя и прочую экзотику надо разруливать Y-кобенатором. У Вирта же получилось однопроходной LL(1) конпелятор поцкаля сделать.
                                          Ответить
                                          • Короче на коленке каким-нибудь дермом из готовой грамматики генеришь конвертер из языка в стек. Потом достаешь готовый форт или лишп или даже сам пишешь на коленке и мои "кресты" готовы
                                            Ответить
                                            • Ох, Гумно вот оно, твоё неосиляторство.

                                              >Потом достаешь готовый форт или лишп или даже сам пишешь на коленке и мои "кресты" готовы
                                              Чтоб твои "кресты" были готовы, нужен оптимизующий jit-компилер из твоей стековой машины в ассемблер реального процессора.

                                              Интерпретатор вот:
                                              http://govnokod.ru/20220#comment335520
                                              Ответить
                                      • А, блин, гумно, забрал ты у меня час своим неосиляторством.
                                        //на вход хуячим выхлоп парсера ["1", "2", "+", "3", "4", "5", "+", "*", "-", "5", "6", "/", "+"]
                                        //на выходе: [-23.166666666666668]
                                        function interpete(out){
                                            var stack = [];
                                        
                                            out.forEach(function(e){
                                                if (fn[e]){
                                                    b = stack.pop();
                                                    a = stack.pop();
                                                    r=fn[e].exec(a, b);
                                                }else{
                                                  r=e|0;
                                                }
                                                stack.push(r);
                                            });
                                            console.log(stack.slice());
                                        return stack[0];
                                        }
                                        Ответить
                                      • >Выкладывай потом на гк. Вместе посиеемся.
                                        http://govnokod.ru/20230
                                        Парсинг и исполнение потокового выражения на лету.
                                        Ответить
                                  • И никаких деревьев.
                                    //джва стекамассива. помнишь, Гумно какая  "единственно полезная структура данных"?
                                    var out=[];
                                    var ops=[];
                                    var fn={ 
                                         '+':{priority:0,exec:function(a,b){return a+b}}
                                        ,'-':{priority:0,exec:function(a,b){return a-b}}
                                        ,'*':{priority:1,exec:function(a,b){return a*b}}
                                        ,'/':{priority:1,exec:function(a,b){return a/b}}
                                        ,'&':{priority:1,exec:function(a,b){return a&b}}
                                        ,'|':{priority:1,exec:function(a,b){return a|b}}
                                        ,'»':{priority:2,exec:function(a,b){return a>>b}}
                                        ,'«':{priority:2,exec:function(a,b){return a<<b}}
                                    }
                                    var op2;
                                    "1 + 2 - 3 * ( 4 + 5 ) + 5 / 6".split(/\s+/).forEach(function(e){
                                    console.log(e);
                                        if (/[0-9]+/.test(e)) {
                                            out.push(e);
                                        }else if (null!=fn[e]){
                                            op2=ops.slice(-1)[0];
                                            while (fn[op2] &&  (fn[e].priority <= fn[op2].priority) ){
                                                out.push(op2);
                                                ops.pop(); 
                                                op2 = ops.slice(-1)[0];
                                            }
                                            ops.push(e);
                                            console.log(ops.slice(0));
                                        }else if (e == "(") {
                                            ops.push(e); 
                                        }else if (e == ")") { 
                                            while (ops.slice(-1)[0] != "("){ 
                                                out.push(ops.pop())
                                            }
                                            ops.pop(); 
                                        }else{
                                            throw 'pitusnya:'+e;
                                        }
                                    })     
                                    
                                    console.log(ops.slice(0),out.slice()) 
                                    var x;
                                    while (x=ops.pop()) out.push(x);
                                    console.log(out)
                                    Ответить
                            • >левая рекурсия

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

                                > Просто по другому записывать все не в самой удобной форме.
                                А кто-то чуть выше рассказывал про то что префиксная нотация НИНУЖНА.
                                Ответить
                                • Так я писал, что инфик рая нотация нужна и она не имеет никакого отношения к записи левой рекурсии
                                  Ответить
                            • С - сверхдержава

                              За чёрствым хлебом в воронежских сёлах выстраиваются в очередь
                              https://www.youtube.com/watch?v=2u6tjvwp_Mo

                              В коментах:

                              Добрыня Никитич6 дней назад
                              путин мразь

                              thealphazoid5 дней назад
                              а коллективный путин - это 140 млн мразей

                              Oleg Oleg6 дней назад
                              блядский обама ,что творит сука!!!!!

                              Сергей Тарасов5 дней назад
                              Если бы этот сюжет вдруг показал телеканал "Дождь"-его бы патриоты с говном сожрали. А тут-ничего,нормально.

                              Александр Квитин4 дня назад
                              у вас есть сыр "Дор Блю"?
                              -Что за сыр такой?
                              -Ну это тот,который с синей плесенью.
                              -Нет .Сыра нет.Есть хлеб "Дор Блю" и колбаса "Дор Блю"

                              Ляля Наивная4 дня назад
                              блядство, по совести- вешаться нужно управленцам хуевым, 40% мировых запасов полезных ископаемых в стране а они олимпиады по 50 000 000 000 долларов закатывают а старики плесень жрут, как скотина.

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

                              Понихейтер Епифанцев9 часов назад
                              В деревнях ели всё этот самый мой хлеб ели!
                              Ответить
                        • .
                          — Я уж построил…
                          — Я тебя сейчас убью, нахуй. Ты понял, что я тя ща убью?
                          — Ну что ты сердишься, прими…
                          — Блядь…
                          —…я тебе доброе дело сделал, принёс комму... войска обстреляли, я тебе идеологию принес... это... не нападал после этого, как коллективизацию провёл, я тебе коммунизма принес, не просил я, не нападал!
                          — Иди вон туда в континент отступай, понял, блядь?!
                          — Я не нападал…
                          — Чтоб через пять минут мирный был! Иди в глубь континента, сука, отступай!
                          — Я не нападал сегодня…
                          — Иди внутрь континента, остутпай, блядь! Германия, бля! Германия! Этот коммунист напал, блядь! Германия! Иди обратно, блядь, чтоб сейчас пришли — ты мирный был, нахуй! Ты понял, бляяя?! Чтобы мирный был, сука! Захватил, пидорас, а! Германия, блядь, он напал! Идите объявляйте войну ему, нахуй, я с ним здесь сидеть не буду, блядь!
                          Ответить
              • > FF требует около 3-4 гиг памяти
                Так там не из-за крестошаблонов компиляция тормозит, а из-за ебанутого оптимизатора в гцц, что блин воротит деревьями всей программы
                Ответить
              • бред. наивный бред.

                видео - камеры пользовательские уже давно могут 4K, но для хорошего интерфрейм кодирования тебе нужно 10-100 кадров в памяти держать. 4К фрейм - 32МB (4 байта на пиксель).

                компиляция/оптимизация - ты наверное LTO на проекте среднего размера не пробовал. 8-12ГБ жрет с легкостью.

                excel - кэширование мат/стат функций жрет столько памяти сколько ему дашь.

                "большие БД тащить на десктоп" - потому что 4ГБ это давно не "большая база". прошный софт давно пользуется локальными встроенными базами для хранение проектов и сессий, и на больших проектах это с легкостью переходит гиг. и некоторый про софт это даже позволяет в RDBMS держать. подкинь пару десятку снэпшотов/версий проекта - и вот ты уже давно >4ГБ.
                Ответить
                • >>бред. наивный бред.

                  > (4 байта на пиксель).
                  Дружище. 32bpp - это RGBA. В него никто не кодирует. Потому что в популярных стандартах/кодеках оно не шибко поддерживается. Самое популярное YUV420 - 12bpp=1.5 байта/пиксель. 99% процентов рипов именно YUV12.

                  >4К фрейм - 32МB (4 байта на пиксель).
                  Но даже 4 байта . Печально видеть когда у программиста проблемы с элементарной арифметикой.
                  4К * 4 байта = 16 Mb.

                  >но для хорошего интерфрейм кодирования тебе нужно 10-100 кадров в памяти держать
                  x264 --fullhelp | less
                  - placebo:
                                                    --bframes 16 --b-adapt 2 --direct auto
                                                    --slow-firstpass --no-fast-pskip
                                                    --me tesa --merange 24 --partitions all
                                                    --rc-lookahead 60 --ref 16 --subme 11
                                                    --trellis 2

                  ПЛАЦЕБО, блеать. 60.

                  8 threads * 60 frames*1.5bpp*4K=6M*60=360M*8=3Gb;
                  Ответить
                  • >4К * 2K * 4 байта = 32 Mb.
                    Да, блин сам глупость сморозил. Но сути это не меняет.
                    Ответить
                    • помножь на потоки. добавь то что тебе еще для всего остального тоже память нужна - и ты с легкостью перепрыгиваешь 4ГБ.

                      для каких ламеров юзверей, им 4Г в ж не сдались. но основной продажный момент ПЦ железа в том что ты на нем потенциально можешь делать.
                      Ответить
                      • Реально лукахеад выше 30-40 кадров никто не использует.
                        >cd x265 && grep -ir lookah *

                        source/common/param.cpp: param->scenecutThreshold = 0; /
                        source/common/param.cpp: param->lookaheadDepth = 10;
                        source/common/param.cpp: param->lookaheadDepth = 15;
                        source/common/param.cpp: param->lookaheadDepth = 15;
                        source/common/param.cpp: param->lookaheadDepth = 15;
                        source/common/param.cpp: param->lookaheadDepth = 25;
                        source/common/param.cpp: param->lookaheadDepth = 30;
                        source/common/param.cpp: param->lookaheadDepth = 40;
                        source/common/param.cpp: param->lookaheadDepth = 60;

                        >помножь на потоки.
                        Я ж помножил:

                        >8 threads *

                        Вылезти за 4 гига при большом желании реально. Я не спорю.
                        Если поставить 32 потока, безумные настройки, кодирование в 10/16 bit. Другой вопрос какой там нужен процессор и как это всё будет тупить.

                        Но легко видеть что при кодировании в 4 потока 4 гига хватит даже для 4К.
                        Ответить
                        • другими словами, 4ГБ это минимальный предел. если ты еще например ОС хочешь одновременно в памяти иметь, например что бы к диску и графике доступатся, то нужно как минимум в двое больше. (х2 ресурсов это вполне нормальное правило для десктопов.)
                          Ответить
                          • >другими словами, 4ГБ это минимальный предел.
                            >если ты еще например ОС хочешь одновременно в памяти иметь

                            Не-не-не. Речь о другом что для ОДНОГО ПРОЦЕССА часто достаточно 4 гига. Тогда указатели внутри этого процесса можно сделать 32-битными.
                            Естественно что процесс может бегать в 64-битной среде и ОС будет оперировать 64-битными указателями = базовый указатель + 32 битное смещение.

                            Кодирование видео в N потоков, можно сделать логически просто разбив файл на N частей, и запустив N процессов, каждый из которых <4Gb.
                            Ответить
                            • "Естественно что процесс может бегать в 64-битной среде и ОС будет оперировать 64-битными указателями [...]"

                              если ты уже проглатил этот poison pill, так какого хера парится?

                              поэтому то с этим делом никто и не парится.

                              я не знаю про твой опыт, но я лично находился по граблям 32 vs 64 бита совместимости и чисто принципиально всегда чистую 32 или 64 бит систему делаю.

                              хотя в новых дебьяная недавно пару раз приходилось ":i386" пакеты ставить, и все даже работало, и даже ничего другого не ломалось, но все равно - на кой хер парится.
                              Ответить
                            • > 4 gb хватит всем.
                              Чертовы луддиты везде

                              надеюсь ты с этого не сделаешь хотябы вывод, что 32хбитной системы хватит всем
                              Ответить
                              • Я между прочим серьезно.
                                А то уже вижу как оконное приложение (пустое окно) занимавшее когда-то 1-3 метра, превращается в 100-200 метровую js-питушню. Не верите? Откройте хром.
                                Сейчас пустая вкладка 100 метров, а завтра 1-2 гига.
                                Ответить
                        • на самом деле, железо позволяет 64 бита - поэтому у нас и есть 64 бита. все остальное это демагогия. площадь ядра на кристале, по сравнению с площадью кэша, это мелочи. поэтому у нас и есть 64 бита.
                          Ответить
                      • А вот и пруфы нагуглились.
                        http://x265.ru/en/compare-x265-and-x264-summer-2014/

                        x264
                        Version: core 142
                        Encoding type: 2 прохода
                        Encoding parameters: –bitrate 4000 –input-res 3840×2160 –fps 50 –level 5.2 –preset placebo –slow-firstpass

                        x264
                        SSIM Mean Y: 0.6073204 (4.060db)
                        Encoding speed: 1.32 FPS (1st pass) и 2.24 FPS (2nd pass)
                        Total encoding time: 10 minutes
                        Peak memory usage: ~2 GB
                        
                        x265
                        Encoding speed: 0.14 FPS
                        Total encoding time: 59 minutes
                        Peak memory usage: not less than 8 GB
                        Encoded file size: 4932 KB


                        И не стоит брать те 8Gb что для x265, то были первые версии.
                        Он за эти 2 года стал намного менее прожорливее.
                        Да и 0.14 FPS — это адски медленно.
                        Ответить
                        • х265 один из самых тормозных кодеков, к слову.

                          и ты продолжаешь тупо цеплятся за текущее состояние софта, которое существует потому что на типичном ПЦ стоит 4 гига памяти.

                          как только стандарт доростёт до 8 или 16 гигов, я уверен что ты там увидшь расход памяти 4 или 8 ГБ.

                          потому что всегда есть что-то что можно съоптимизировать с помощью дополнительно рабочей памяти.
                          Ответить
                          • >x265 один из самых тормозных кодеков, к слову.
                            Известный факт. Тому есть несколько причин.
                            1. Это ты еще HM (референсный hevc) не пробовал! Там скорость 1 кадр/минуту для 640х480 — это обыденность.
                            2. x265 пишут индусы и Мин Чен. Хотя и стараются (тырят лучшие части x264).
                            3. Стандарт hevc очень сложный и многогранный. Количество вореций, которые надо перебрать больше AVC на порядок.

                            >что всегда есть что-то что можно съоптимизировать с помощью дополнительно рабочей памяти.
                            И в этом главная проблема многих современных разрабов.
                            А! У них теперь 8 гиг, давайте засунем в наш софт еще 100500 свистоперделок!
                            Ебаный оверинжиниринг.
                            Ответить
                            • > И в этом главная проблема многих современных разрабов.

                              ты путаешь "расточать ресурсы" и "использовать ресурсы".

                              возми тот же hash vs tree: с помощью памяти O(log(n)) поиск делается почти в O(1).

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

                              к слову. с современными фреймворками, я редко вижу что бы разрабы ресурсами за зря разбрасывались: за них это делают сами фреймворки, на правах дополнительного сервиса и упрощения работы. почему народ ими и пользуется.
                              Ответить
                              • ты считаешь хешмап медленнее на средней задаче, чем трии?
                                Ответить
                                • ноборот, очевидно.
                                  Ответить
                                  • На больших объемах n некоторые считают умники считают O(log n) просто тяжелым О(1))))))
                                    Ответить
                        • Где памяти катастрофически не хватает: эн-грамы. Т.е. поиск вероятности сочетаний слов (иначе - вореции). В 64 гигабайта влезает примерно 4-5 словосочетаний. Обычно в предложении около десяти слов.

                          Где еще может использоваться много памяти - системы реального времени, где динамически выделять память - плохо, и ее всю доступную сразу же выделяют для програмы. Например, файловая система в датацентре может занимать несколько сот гигабайт памяти (кешировани восновном). Кеши всяких СиДиЭнов и т.п. тоже будут очень большими - там свободной памяти не бывает.
                          Ответить
                          • > не хватает: эн-грамы. Т.е. поиск вероятности сочетаний слов (иначе - вореции).
                            А да. Но вот тут и не поспоришь. Архиваторам памяти никогда не будет много.
                            Ответить
                  • (removed)
                    Ответить
                  • > 4К * 4 байта = 16 Mb.
                    4k * 4k * 4 = 64 мб
                    Ответить
                    • Откуда питушня?
                      Стандарт           Разрешение,    Всего
                                          пикселей     пикселей
                      Полнокадровый 4K   4096 × 3112  12 746 752
                      Академический 4K   3656 × 2664   9 739 584
                      Широкоэкранный 4K  4096 × 1714   7 020 544
                      Full 4K            4096 x 2160   8 847 360
                      Кашетированный 4K  3996 × 2160   8 631 360
                      Ultra HD 4K        3840 × 2160   8 294 400

                      Берём с Википедии таблицу вореций. Зожимаем до нижней и верхней границ: 7e6 пикселей и 12.8e6 пикселей; кобенируем по 4 байта на пиксель - 28e6 и 51.2e6 бат; приводим на 1024 - 26.7 и 48.8 мега бат; натализируем числа для круглования: для кадра 4К нужно 26-49 мега бат.
                      Ответить
                      • 4096 × 4096
                        Ответить
                      • А я думал, что 4К — это 80×50 или 160×25.
                        Ответить
                      • >Берём с Википедии таблицу вореций. Зожимаем до нижней и верхней границ: 7e6 пикселей и 12.8e6 пикселей; кобенируем по 4 байта на пиксель - 28e6 и 51.2e6 бат; приводим на 1024 - 26.7 и 48.8 мега бат; натализируем числа для круглования: для кадра 4К нужно 26-49 мега бат.

                        [смотрит с ворцищённым ворежением лица]
                        Браво!
                        Ответить
                      • > мега бат
                        Хан Мега-Батый.
                        Ответить
                • > excel - кэширование мат/стат функций жрет столько памяти сколько ему дашь.

                  А что он там делает? Страничку и список зависимостей храни и все
                  Ответить
                  • > Страничку и список зависимостей храни и все

                    ты про что?
                    Ответить
                    • > ты про что?

                      я про страничку с ячейками и зависимостями ячеек для пересчета, а ты про что? Это типа мой вопрос
                      Ответить
                      • ну ты же видел что в ячейках могут быть формулы? и что мат библиотека в эксэле очень и очень и очень большая?

                        полный пересчет целого шита может >5 секунд занимать с легкостью.

                        некрософт не от хорошей жизни там многопоточность & 1M rows поддерживает. прежде чем для симуляции какую программу кодировать, профи гоняют формулы в эксэле.
                        Ответить
                        • Так я сказал, что зависимости между ячейками просто хранить. А кешировать то там что? Какие такие статистические функции?
                          Ответить
                          • куда ты здесь зависимости постоянно пытаешься втыкивать?

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

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

                                автопересчет мешает если надо менять несколько (например) коэфицентов одновременно.
                                Ответить
          • 4GB, а не 4Gb. 4 гигабайта.
            Ответить
      • Да везде такого добра полно
        https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/HaskellExecution/PointerTagging

        Про печальные окамлооптимизации я вообще молчу.
        Ответить
        • Раз "везде" почему крестухи питушатся, делая сранные хаки и по-прежнему, используя 64битные указатели, там где хватило бы и 32-бит?
          Ответить
          • Пирфоманс?
            Ответить
            • Еще кокой.
              Особенно на всяких std::vector с указателями в кучу и прочих linked list & queue.

              http://www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507
              Страница 16

              Царь же делал тут доклад о "единственно полезной структуре данных".
              Ответить
              • > единственно полезной структуре данных
                Массив? Ну что еще школьник то мог предложить, когда ни одного приложения еще не написал
                Ответить
                • Ну гумно, ты классики не знаешь, а лезешь.А царь знал. Потому думаю он совсем не школьник.

                  Слова не Школьника, но Настоящего Программиста.
                  Ответить
                  • Какой классики я не знаю? Ну массив полезная структура. Ну и что? Писать на одних лишь массивах - это какой-то сишник-головного мозга. На код больше половины сишников смотришь и думаешь: вот пля дибил, неужели других структур данных более удобных или подходящих не знаешь? Мама, роди его обратно.
                    Ответить
                    • Оперативная память устроена как массив. Для адресации есть только смещение, мне Царь сказал. Всё более сложное — для теоретиков.
                      Ответить
                      • Так это вы надомной троллили целый день. Етить я бестолоч. У меня батхерт
                        Ответить
    • https://en.wikipedia.org/wiki/X32_ABI

      The x32 ABI is an application binary interface (ABI) and one of the interfaces of the Linux kernel. It allows programs to take advantage of the benefits of x86-64 instruction set (larger number of CPU registers, better floating-point performance, faster position-independent code shared libraries, function parameters passed via registers, faster syscall instruction) while using 32-bit pointers and thus avoiding the overhead of 64-bit pointers.

      Though the x32 ABI limits the program to a virtual address space of 4 GiB, it also decreases the memory footprint of the program, and in some cases, can allow it to run faster. The best results during testing were with the 181.mcf SPEC CPU 2000 benchmark in which the x32 ABI version was 40% faster than the x86-64 version. On average, x32 is 5–8% faster on the SPEC CPU integer benchmarks compared to x86-64. There is no speed advantage over x86-64 in the SPEC CPU floating point benchmarks.
      Ответить
      • ну если тестить x64 код на x32 проце то да
        Ответить
        • О боже! Там же для особо одарённых специально жырненьким выделено

          It allows programs to take advantage of the benefits of x86-64 instruction set (larger number of CPU registers, better floating-point performance, faster position-independent code shared libraries
          Ответить
          • много гона. это просто реклама адвокатов.

            "larger number of CPU registers" - да.
            "better floating-point performance" - нет.
            "faster position-independent code shared libraries" - нет.

            и два последних "нет" ничего общего с 32 vs 64 не имеют. просто обычный 32 бит режим сидит на уровне совместимости со всеми актуальными 32 бит процами, почему и не может некоторыми фичами (типа новые SSE, или CMOV) пользоваться. с другой стороны, х32 может пользоватся новыми фичами, потому что старые 32 бит проца в принципе не поддерживает.

            находил переписки гцц/либц разрабов на эту тему, и народ просто решил что апдейт 32 бит ABI не имеет смысла. потому что кучи народа все еще пользуются процами со старыми 32 бит ядрами (те же атомы интеловы), в то время как новым пользователям, на большинстве приложений, выгода очень маленькая (народ цитировал gcc бенчи в районе 1-2% разницы).

            я знаю что кучи дисто на это дело забили, потому что надо еще одну иерархию в /usr заводить, и с этим всегда много граблей в особенности в начале.
            Ответить
            • >"better floating-point performance" - нет.
              Они имели ввиду новые SSE/AVX с широкими регистрами.
              Хотя согласен что выигрыша особо нет. Число исполнительных блоков такое же.

              Профит только в меньшем количестве команд на то же кол-во данных. И даже не двухкратный. Поскольку команда для 128 битного SSE короче команды для 256 битного.
              Ответить
              • насколько долго 32 бит процы будут существовать, у х32 шансов на популярность мало. учитывая что интел продолжает штамповать супер дешевые атомы, я даже не уверен когда это может произойти. (с другой стороны: oh, look! it's passively cooled PC! and it uses intel cpu!! it must be good!!!)
                Ответить
      • Нестабильно. У меня сейчас в системе 3 ABI и в x32 не работают иксовые клиенты
        Ответить
      • > On average, x32 is 5–8% faster on the SPEC CPU integer benchmarks compared to x86-64.

        и что эти "SPEC CPU integer benchmarks" умеют делать? интернет бравзить? музыку/видео прогрывать? компилировать?

        о, да, это пустой бенчмарк.

        ежику понятно что х64 будет медленее чем х32. но это точно также как и utf-8: utf-8 медленее чем ucs4, но все равно все им пользуются, потому что удобнее.
        Ответить
        • > utf-8 медленее чем ucs4, но все равно все им пользуются, потому что удобнее.

          Для хранения и передачи. Если строку надо редактировать, то её переводят в fixed-wifth. Даже Питон ЕМНИП внутре с утф8 не оперирует.
          Ответить
    • херасе срадж
      Ответить
    • Шланг наносит байтоёбам ответный удар:
      Fix x86-64 ABI conformance issue in SIMD code
      (descriptions cribbed by DRC from discussion in #20)
      In the x86-64 ABI, the high (unused) DWORD of a 32-bit argument's
      register is undefined, so it was incorrect to use a 64-bit mov
      instruction to transfer a JDIMENSION argument in the 64-bit SSE2 SIMD
      functions. The code worked thus far only because the existing compiler
      optimizers weren't smart enough to do anything else with the register in
      question, so the upper 32 bits happened to be all zeroes-- for the past
      6 years, on every x86-64 compiler previously known to mankind.

      The bleeding-edge Clang/LLVM compiler has a smarter optimizer, and
      under certain circumstances, it will attempt to load-combine adjacent
      32-bit integers from one of the libjpeg structures into a single 64-bit
      integer and pass that 64-bit integer as a 32-bit argument to one of the
      SIMD functions (which is allowed by the ABI, since the upper 32 bits of
      the 32-bit argument's register are undefined.) This caused the
      libjpeg-turbo regression tests to crash.
      Ответить
    • Немного оффтопика про указатели - сегодня своими глазами увидел, почему указатели на функции нельзя кастовать в обычные указатели: на cortex-m4 указатели на thumb функции нечётные.
      Ответить
      • Как бы намекает, что низкоуровневые языки не нужны.

        Это что, типа, разные указатели?
        Ответить
        • В младший бит спрятали режим, в который надо переключить ядро после перехода (arm = 0, thumb = 1).
          Ответить
          • То есть, указатель не обязан хранить в себе адрес?
            Ответить
            • Ну да. Или может хранить адрес из вообще другого адресного пространства, до которого через обычные указатели никогда не добраться (если гарвардская архитектура).
              Ответить
            • Скорее -- не только адрес. GHC, например, в младшие биты ссылки на ADT любит зожимать порядковый номер конструктора для ускорения pattern-matchingа. Ну плюс всякие дебажные тулы этим грешат для каких-то своих целей.
              Ответить
      • Пример кода можно? (Как делать нельзя)
        Ответить
      • А в воидзвёздочку можно?
        Ответить
    • >Младшие биты указателей на выравненные типы всегда нулевые. Из за этого (по формуле Шеннона) указатель несёт в себе меньше информации, оставаясь того же размера. Битоёбов это расстраивает.

      Вообще-то это известный трюк
      https://www.quora.com/How-did-game-developers-pack-entire-games-into-so-little-memory-twenty-five-years-ago/answer/Dave-Baggett?srid=z9ZA&share=1


      By far the best part in retrospect—and the worst part at the time—was getting the core C/assembly code to fit. We were literally days away from the drop-dead date for the "gold master"—our last chance to make the holiday season before we lost the entire year—and we were randomly permuting C code into semantically identical but syntactically different manifestations to get the compiler to produce code that was 200, 125, 50, then 8 bytes smaller. Permuting as in, "for (i=0; i < x; i++)"—what happens if we rewrite that as a while loop using a variable we already used above for something else? This was after we'd already exhausted the usual tricks of, e.g., stuffing data into the lower two bits of pointers (which only works because all addresses on the R3000 were 4-byte aligned).
      Ответить
      • > R3000
        Первая плойка (статью ещё не читал)?
        Ответить
        • Да, это Crash Bandicoot для PlayStation 1. Вот перевод с хабра https://habrahabr.ru/post/260637/
          Там кстати Lisp есть
          Ответить
      • >This was after we'd already exhausted the usual tricks of, e.g., stuffing data into the lower two bits of pointers (which only works because all addresses on the R3000 were 4-byte aligned).

        Класс!

        Да, были люди в наше время,
        Не то, что нынешнее племя:
        Цари — не вы!
        Плохая им досталась доля:
        Не будь на то господня воля,
        Не отдали б и бит!


        Так это самое и предлагается.
        Когда закончатся 4Гб, адресовать не байтами, а выравняными 64-битными словами. 32Гб при 32-битной адресации.
        Ответить

    Добавить комментарий