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

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #include <iostream>
    using namespace std;
     
    struct Foo {char a; int b; char c;};
    struct Bar {char a; char b; int c;};
     
     
    int main() {
    	cout << sizeof(Foo) << endl;
    	cout << sizeof(Bar) << endl;
    }

    https://ideone.com/XKWey3

    Какой бароп )))

    Запостил: 3_dar, 08 Октября 2020

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

    • Анскильный оптимизатор не может догадаться переставить поля местами. Потому что в 99.99% случаев мне поебать на порядок, всё ради 0.01% пердоликов байтоблядей.
      Ответить
      • >переставить поля местами.
        во всех .h файлах, где эти структуры декларированы
        Ответить
        • Ты, видимо, входишь в 0.01%. У меня всё линкуется статически.
          Ответить
          • Какая разница, статически или динамически?

            Во всех модулях, из которых собирается экзешник, порядок полей в структуре должен быть одинаковым, иначе данные распидорасит.
            Ответить
            • Нахуя? Если ты сериализуешь данные как кусок памяти, то ССЗБ.
              Ответить
              • Вот у тебя есть модуль pethu.c. В нём объявлена функция pitushnya, которая принимает на вход структуру.

                У тебя есть модуль kurochka.c. В нём ты вызываешь функцию pitushnya из другого модуля, в которую передаёшь структуру.

                Чтобы это работало, в модулях kurochka.c и pethu.c порядок полей в структуре не должен зависеть от параметров оптимизации.
                Ответить
                • если их скомпилировал разный компилятор, то ты сам соснул же

                  или ты должен extern "C"
                  нет?
                  Ответить
                • Ничего не понимаю. Что такое модуль? В "PHP" нет никаких модулей. Я же сказал, что я собираю программу в один экзешник и теку.
                  Ответить
                  • ты прав, ты прав

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

                    А вот а если ты хочешь сделать .so/.dll, то вероятно оптимизировать нельзя:
                    лейаут структуры же тогда будет частью ABI, но вроде бы ABI у С++ не гарантируется, только у си
                    Ответить
                    • Да и с длл всё норм будет если перестановку полей как часть ABI задокументировать.
                      Ответить
                      • А как это задокументировать?

                        Вот я клиент, у меня есть .h файл, как моему компилятору понять, что ты там напаерестовлял?
                        Ответить
                        • Дык опиши правила перестановки полей в ABI (например "стабильная сортировка по убыванию размера"). И все конпеляторы, которые его соблюдают, будут делать это одинаково.
                          Ответить
                          • А в «Java» это из коробки
                            Ответить
                            • А вот интересно: в джава у getstatic вроде индекс смешения, и как же он его находит?

                              а, там вроде contant pool: то есть там серху написано "поле ptiz -- номер 8", а потом в коде getstatic 8
                              Ответить
                              • getstatic относится к классу, а не к инстансу, нет? но подозреваю что там всё так же пакуется, лонги впереди интов и тому подобное
                                Ответить
                                • да, но и invokevirtual так же работает

                                  сначала у тебя написано

                                  method "getPetuz()" -- #42

                                  А потом invokevirtual #42
                                  Ответить
                          • типа в той же главе, что и кол конвешнеш?

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

                                  Но смешивать дебаг с релизом, как петух ниже предлагает, часто тоже нельзя. В студии например просто не слинкуется.
                                  Ответить
                                  • то есть вот этот вот паддинг и НЕ перестановка полей, от которой подгорело у Инью (видимо это он) это часть ABI?
                                    Ответить
                                    • Ну да. Паддинг - часть платформенного ABI.

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

                                        а почему не благославить перестановку?
                                        Ответить
                                        • Потому что от перестановки сишники будут плакать.

                                          Хотя какую-нибудь #pragma reorder можно сделать по аналогии с #pragma pack.
                                          Ответить
                                          • так а нельзя сказать: "хочешь сишки -- пиши extern '"C", а внутри .cpp я могу что угодно дллать"
                                            Ответить
                                            • Можно, но крестобляди ведь тоже контроль любят.

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

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

                                                а если у меня структура в которой структура в которой структура в которой структура? Как это посчитать?
                                                Ответить
                                                • А никак, только подглядев в ту структуру.
                                                  Ответить
                                                  • Скучно

                                                    хочу у решарпера кнопку "sort by size"
                                                    Ответить
                                              • У меня идея: добавить поддержку линкером переставленных полей. Сделать так, чтобы компилятор в объектный файл писал не константное смещение поля, а добавлял специальную запись в таблицу фиксапов, а линкер потом при сборке фиксил. И чтобы суммарный размер структуры тоже клался в таблицу фиксапов...

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

                                                  типа поле не 22 а 22 + fixup
                                                  Ответить
                  • В рантайме нет никаких имён полей[s], именно поэтому я за «рантайм»[s], к полям доступ только по заранее вычисленному смещению. Чтобы у тебя объектные файлы собрались в один экзешник без распидорашивания данных, нужно, чтобы в каждом объектном файле одному и тому же имени поля соответствовало одно и то же значение смещения. Линкер эту питушню не фиксит, она в объектный файл поступает уже в виде константы.
                    Ответить
                    • Ты разве не обязан все объектные файлы собирать одним и тем же компилятором С++?
                      Ответить
                      • Я могу один собрать с -O0, другой с -O2, третий с ещё какими-нибудь параметрами.

                        Откуда компилятору с -O0 знать, что ты хочешь экономить память?
                        Ответить
          • питух почитай про ODR питух

            и про миллион одинаковых деклараций, которые обязаны совпадать
            Ответить
            • хуйню написал
              извини

              ты можешь в другом файле задекларировать другую Foo

              удоли мой предыдущий коммент, стыдно
              Ответить
        • Более того, приведённый пример - это .cpp файл. От перестановки ничего не сломается.
          Ответить
          • на нем написано, что ты его никуда не включил?
            Ответить
      • Если ты не пердолик-байтоблядь, а высокоуровневый питуз, тебе должно быть насрать на пару проебаных байтиков в структуре из-за порядка полей
        Ответить
    • поздравлялля, ты открыл для себя выравневанне
      Ответить
    • Надо написать говностандатризаторам, чтоб в крестопарашу добавить особую питушню, которая б оптимально распихивала поля в структуре, чтоб и unaligned доступа не было, и чтоб плотно, типа
      struct Foo __do_optimal_shit({char a; int b; char c;});

      становилось как

      struct Foo {char a; char c; int b;};
      Ответить
      • Согласен. Хорошее решение. Либо новые литералы, например real_struct и real_class.
        Ответить
        • Вот да, добавим в крестопарашу побольше всякой херни. Настоящие четкие пацаны пользуются только реальными вещами, real_struct, real_class, mysql_real_escape_string
          Ответить
          • А что, это не шутка. Это позволяет перемешивать поля одинаково везде, вне зависимости от компилятора и уровня оптимизации.
            Ответить
          • Не только в крестопарашу, в Си тоже.
            Ответить
        • У «gcc» есть атрибуты «aligned» и «packed», чтобы ты мог указать, что тебе важнее: экономить память или получить быстрый доступ.

          https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes
          Ответить
          • Эти атрибуты указывают компилятору что вот можно насрать на требования выравнивания, и всю хуйню зожать. А тут же речь идет о перестановки полей в структуре, чтобы описывать их можно было в хуйпойми каком порядке, но компилятор их распихал так, чтоб и рыбку съесть, и на хуй сесть и дыр не было, и невыровненного доступа не было, а на порядок хуйни в структуре нам насрать.
            Ответить
          • Я знаю. Раз такое есть, то не составит труда ввести питушню, которую предлагает j123123. И включить её по умолчанию. Это экономия по памяти без ущерба к доступу.
            Ответить
    • Опять выравниваешь, шакал ебучий?
      Ответить
    • Попробуй атрибут [[no_unique_address]] кста. Вроде как с ним конпелятор будет более свободно обращаться с полями.
      Ответить
      • Если я правильно понял, он позволяет всего лишь накладывать поле на предыдущее нулевого размера.
        Ответить
        • а еще он может сунуть под хвостик ему кого-то

          If the member is not empty, any tail padding in it may be also reused to store other data members.
          Ответить

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