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

    +1005

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    #define KB * 1024
    #define MB KB KB
    #define GB MB KB
    #define TB GB KB
    
    int main( ... )
    {
       char * arr = new char [16 MB];
       ...
    }

    Запостил: k06a, 14 Мая 2010

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

    • удобно ^^
      Ответить
      • но все равно гавно.

        моя нотация менее элегантна, но тем неменее: (N<<10) для Н КБ; (N<<20) для Н МБ.

        ГБ и ТБ еще ни разу надо не были.

        или еще проще: 16*1024*1024 - так оно всем понятней, включая тех кто в сдвигах плохо рубит.
        Ответить
    • Красиво.
      Ответить
      • Но действует только для char
        Ответить
        • Для других типов не сойдётся размер.
          Ответить
          • Ибо аргумент new задает кол-во экземпляров, а не размер занимаемой ими памяти.
            Ответить
        • Ещё применимо в условиях, while (arraySize < 2 MB) { ... }
          Ответить
    • Не хватает для единства обозначений
      #define B * 1
      Ответить
      • Можно ещё #define Kb * 1024 * 8
        Ответить
        • 8 килобайт ? :)))
          Ответить
          • > #define Kb * 1024 * 8
            Это килобит

            --
            Ваш К. О.
            Ответить
            • А теперь попробуйте выделить нужно кол-во килобит памяти с этим суффиксом.
              Ответить
              • А я разве сказал, что так можно выделять память? Хотя Ваше замечание в чем-то верно, если кому-то нужно будет выделять память в килобитах, то код нужно подправить:
                #define Kb * 128

                Лично я не вижу применения ни этому гк, ни исходному гк.
                Ответить
    • Для GB и TB будет integer overflow (в gcc точно будет). Желательно исправить первую строку:
      #define KB * 1024LL

      Так код будет более переносимым.
      Ответить
      • Для GB точно НЕ будет.
        Ответить
        • 8 GB = 8 * 1024 * 1024 * 1024 = 8 589 934 592 - гарантированно не влазит даже в unsigned int ( 4 294 967 296 ) на 32-битной платформе. В принципе, переполнения можно добиться и таким кодом:
          8192 MB

          так что не принципиально.
          Ответить
          • откуда 8 ??? Если так рассуждать то и 1000000000 KB будет overflow.
            Ответить
            • > Если так рассуждать то и 1000000000 KB будет overflow.
              Да. Люди обычно стараются брать большие единицы измерения. Вы же не скажете на рынке: "Дайте мне, пожалуйста, две тысячи грамм картошки"?
              Внимательно прочитайте последнее предложение в моем посте. Моя позиция в том, что без "LL" код потенциально багоопасен.
              Ответить
              • 1 GB будет работать и в исходном варианте, а вот 1 TB уже нет. А если LL заменить на ULL будет еще лучше.
                P.S. две тысячи рублей например чаще говорят, чем два кило рубля :) Так что вопрос в единицах измерения и культурных традициях.
                Ответить
                • А вот с баксами строго наоборот, все сплошь и рядом в килобаксах оперируют!
                  Ответить

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