Кресты / Говнокод #27009 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 3_dar, (Updated )

Комментарии (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 (например "стабильная сортировка по убыванию размера"). И все конпеляторы, которые его соблюдают, будут делать это одинаково.
                        Ответить
                          • А вот интересно: в джава у getstatic вроде индекс смешения, и как же он его находит?

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

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

                                method "getPetuz()" -- #42

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

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

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

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

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

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

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

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

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

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

                                                типа поле не 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
        Ответить
        • А что, это не шутка. Это позволяет перемешивать поля одинаково везде, вне зависимости от компилятора и уровня оптимизации.
          Ответить
        • Эти атрибуты указывают компилятору что вот можно насрать на требования выравнивания, и всю хуйню зожать. А тут же речь идет о перестановки полей в структуре, чтобы описывать их можно было в хуйпойми каком порядке, но компилятор их распихал так, чтоб и рыбку съесть, и на хуй сесть и дыр не было, и невыровненного доступа не было, а на порядок хуйни в структуре нам насрать.
          Ответить
        • Я знаю. Раз такое есть, то не составит труда ввести питушню, которую предлагает j123123. И включить её по умолчанию. Это экономия по памяти без ущерба к доступу.
          Ответить
  • Попробуй атрибут [[no_unique_address]] кста. Вроде как с ним конпелятор будет более свободно обращаться с полями.
    Ответить
    • Если я правильно понял, он позволяет всего лишь накладывать поле на предыдущее нулевого размера.
      Ответить
      • а еще он может сунуть под хвостик ему кого-то

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8