1. JavaScript / Говнокод #27882

    −7

    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
    // @strict: true
    interface IFace {
        cond0: boolean;
        cond1?: boolean;
    }
    
    function main() {
    
        const a : IFace = { cond0: true };
    
        print (a.cond0);
        print (a.cond1 == undefined);
        print (a.cond1);
    
    	// a.cond1?.value
    
        print("done.");
    }

    я вам принес новую фичу. называется опциональные поля в interface-ах. а твой с++ умеет так?

    Запостил: ASD_77, 19 Декабря 2021

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

    • вот вам дампик... https://pastebin.com/Y9vMnFwi
      Ответить
    • и результат работы -

      C:\temp\MLIR_to_exe>1.exe
      true
      true
      false
      done.
      Ответить
      • > опциональные поля
        std::optional?
        Ответить
        • анука забацай пример как у меня с интерфейсом... хочу глянуть на дичь
          Ответить
          • > с интерфейсом
            у меня в С++ никаких интерфейсов нет.
            Можно конечно концепт забабахать, чтобы cond1 было булом или его вообще не было.
            Ответить
    • Ё-моё, было б о чём говорить…
      struct IFace {
          bool cond0;
          std::optional<bool> cond1 = std::nullopt;
      };
      
      int main()
      {
          const IFace a = { true, };
      
          std::cout << std::boolalpha
              << a.cond0 << std::endl
              << !a.cond1.has_value() << std::endl
              << static_cast<bool>(a.cond1) << std::endl;
      
          return EXIT_SUCCESS;
      }
      Ответить
      • это все хаки... хакерские проделки... начнем с того что размер моей структуры 1 байт.. а твоей :)?
        Ответить
        • > размер моей структуры 1 байт

          Press X to doubt.
          Ответить
          • вот строка которая создает
            { cond0: true }
            store { i1 } { i1 true }, { i1 }* %3, align 1, !dbg !9

            i1 это 1 бит... ну там выравнивание еще будет 1 байт макс
            Ответить
            • А в С++ было бы 0 байт, потому что структуры нахрен бы выоптимизировались.

              Что будет, если условно создавать IFace и передавать её так, чтобы компилятор не мог предсказать ещё использование? Тебе же придётся хранить информацию о наличии и/или значении cond1.

              Если компилятор не норкоман и не умеет упаковывать кучу булов в 1 байт. Тогда да, для хранения состояния всей структуры понадобится 3 бита, но пирфоманс начнёт присасывать.
              Ответить
              • Совершенно верно.
                https://gcc.godbolt.org/z/1GYMh9T3Y (для наглядности говноcout заменён на православный «printf»):
                .LC0:
                        .string "%d\n%d\n%d\n"
                main:
                        sub     rsp, 8
                        xor     ecx, ecx
                        mov     edx, 1
                        mov     esi, 1
                        mov     edi, OFFSET FLAT:.LC0
                        xor     eax, eax
                        call    printf
                        xor     eax, eax
                        add     rsp, 8
                        ret

                «C++» успешно соптимизировал структуру в 0 байт.
                Ответить
                • > для наглядности говноcout заменён на православный «printf»

                  Вот сразу бы так. Въебал плюс за использование тьюринг-полных операторов.
                  Ответить
              • Ладно, если не совсем читерить, то можно сделать специализацию для була, которая весит один байт...
                Ответить
              • > пирфоманс

                А по-моему норм будет: позиции битов фиксированные, and, or да test. Это же не вектор булов, где всё динамичное.
                Ответить
              • А можно, чтобы по размеру структуры определялось, какие поля определены, а какие нет.
                Ответить
                • нельзя потому что размер структуры не гарантирует наличие поля. всегда можно подобрать комбинацию из полей которое будет давать нужный размер
                  Ответить
        • > начнем с того что размер моей структуры 1 байт.. а твоей :)?

          Просто здесь, как обычно, пацан возьмет Сишку.
          В которой есть волшебное слово struct. И привычно сольет тупоскрипт питуха.
          typedef struct
          {
              unsigned cond0 : 1;
                signed cond1 : 2;
          } s;


          «Сишка» — язык для белых людей.
          Ответить
          • Всего 1 байт, ха!

            Какая жалкая, никчёмная структура. То ли дело "Nim", здесь структура весит целых 16 мегабайт! Не то, что ваши дистрофичные-булимичные целочки-структурочки.
            type Koko = object
              cond0: uint
              cond1: int
            
            echo sizeof(Koko(cond0: 1, cond1: 2)) # out: 16
            Ответить
        • > начнем с того что размер моей структуры 1 байт.. а твоей :)?

          Тут люди говорят, что «в 2021 веке воевать за сохранение 1 байта данных - это супер круто... а главное только сумасшедшие будут это делать :)»
          Ответить
    • > я вам принес новую фичу

      Сишке почти 50 лет, но все эти т.н. «новые фичи» там уже давно реализованы )))
      #include <stdio.h>
      
      #define TRUE  -1
      #define FALSE -2
      #define undefined(x) !!(x>=0)
      #define print(bool) printf("false\n\0true\n" + 7 * (bool&1));
      typedef struct
      {
          unsigned cond0 : 1;
            signed cond1 : 2;
      } iAss;
      
      int main(void) 
      {
          iAss a = {cond0:TRUE};
          print(a.cond0);
          print(undefined(a.cond1));
          print(a.cond1);
          puts("done");
          return 0;
      }

      https://ideone.com/yp2bry
      Ответить
      • Как-то вербозно и длинно получилось. Переписал на Jawa, чтобы было покороче:
        class Koko {
            public Boolean cond0;
            public Boolean cond1;
        };
        
        public static void main(String []args) {
            Koko kok = new Koko();
            kok.cond0 = null;
            kok.cond1 = new Boolean(true)
        };
        Ответить
        • log4j забыл подключить — программа ничего не напечатала.

          Edit: Ахаха. Или это для безопасности? В любом случае йажа обосралась — код ничего не выводит.
          Ответить
      • > !!(x>=0)
        Приведение булева в булево?
        Ответить
    • > const a : IFace = { cond0: true };

      print (a.cond0);
      print (a.cond1 == undefined);
      print (a.cond1);

      // a.cond1?.value

      print("done.");
      }

      >я вам принес новую фичу. называется опциональные поля в interface-ах. а твой с++ умеет так?

      Пальнем-ка пулею в святую Русь!
      В избяную, кондовую, толстозадую!

      Эх, эх, без креста!
      Ответить

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