Куча говна / Говнокод #25024 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
"Сайт о прыщах, 9858 руб./месяц, 1000+ чел/сутки":

https://telderi.ru/ru/viewsite/1356387

"Продам сайт о прыщах, выписано 156 статей, можно собрать СЯ и полностью охватить тему, сайт любит и Гугл и Яндекс, трафик идет одинаково.
Монетизация под эту нишу может быть офферная - с неё я думаю доходы будут выше, чем 10 000 руб. в месяц, я к сожалению опыта работы с офферами не имею, в принципе как и времени на этот проект.
Просадка трафика на графике связана с фильтром от гугла: ранее сайт стоял с неоформленными статьями (без картинок, с битыми ссылками на видео), все переоформили и фильтр был снят. Я тут этот сайт
и купил, пока он был под фильтром.
Ссылки не закупались, но они и не нужны - гугл хорошо ранжирует сайт. Можно сделать перелинковку для увеличения позиций и трафика".

Запостил: 0BEH 0BEH, (Updated )

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

  • Нравиться ли Тебе наш администратор?
    Он забанил моеу учетку (
    Ответить
    • Прости, погорячился, но как ещё вас наказывать за гомоспам, флуд и взламывание учёток?
      Могу дать пароль от adrnin'a (123), взамен обещай быть пай-мальчиком и хорошо себя вести, ок?
      Ответить
  • >Тематика сайта: Семья. Здоровье
    Ща кто-нибудь купит - а там действительно прыщи.
    Ответить
    • Погуглил. Тематика вовсе не уникальная. «Сайтов о прыщах» море. Какой смысл в покупке? Выкупить сайт, чтобы его закрыть?
      Ответить
  • Сайта у меня нет, но могу продать прыщи если хотите
    Ответить
  • Я третьего дня решил стать крестоб*ю и мне открылись ужасные ужасы.

    Например, у меня в файле Pitux.hpp описан класс Pitux.
    Разумеется, только его интерйфейс (декларации). Дефиниции у меня в Petux.cpp.

    Однако же все поля (включая private!) я тоже должен описать в .hpp. Это и понятно: клиент класса должен уметь посчитать его размер чтобы ложить его в стек (кстати, а для new же тоже должен знать? Там же malloc(sizeof(Petix)) под капотом?))

    Однако по сути это означает что я мало того что свечу наружу (пусть и приватно) детали реализации, так еще и инкрементальная копуляция будет мне пересобирать Client.cpp когда я решу переименовать приватное поле в Petuh.hpp !

    Воркэрануды все какие-то пидерастические: Pimpl (он же Bridge) предлагает создать кучу кода, например.

    Крестобляди, как вы с этим живете?
    Ответить
    • Есть такая небольшая проблема.
      А что можно было бы добавить в язык, чтобы это решить? Как-нибудь так?:
      // Cormorant.hpp
      class Cormorant {
      public:
      private:
        ...; // Это буквально три точки, а не "и так далее"
      };

      // Cormorant.cpp
      #include "Cormorant.hpp"
      
      int Cormorant::m_Field;

      Тогда sizeof(Cormorant) будет константой времени связывания. Интересно, к чему это приведет...
      Ответить
      • >> Интересно, к чему это приведет...
        ИМХО: к динамическому разрастанию стека (типа VLA или alloca), и (вероятно) некоторому пенальти по перформансу и потенциальным StackOverflow.

        Но мысль интересная.

        Другой вариант ВСЕГДА хранить Cormorant в куче, и брать у него размер (так делает Java кмк)
        Ответить
      • В Жабе, в языке Ада, в Модуле, в Турбо Паскале, в Дельфи, во Фрипаскале это решили по-другому: там вообще не нужно включать в свой исходник текстовое описание класса. Там слово import или uses вытягивает публичные определения из скомпилированного модуля.
        Ответить
        • потому што в .class файле это знание есть, а в .so и .dll -- нету (кроме .net .dll, но там другое)

          Однако же в момент компеляции файл ВСЕ РАВНО нужен потому что связовывание хоть и динамическое, а интерфейсы знать надо

          но если бубличный ифейс не поменялсо то перекопулировать там не надо, да
          полагаю что это потому, что всё в куче
          Ответить
          • В трубопаскакале для решения этой проблемы изобрели свой формат модулей — TPU. Результат — несовместимость с другими линкерами.

            Во Фрипаскале пошли другим путём: исполнимый код стали компилировать в распространённый формат модулей (COFF, чтобы его мог подхватить любой стандартный линкер), а бубличные междумордия (требующиеся при компиляции других модулей) стали сохранять в PPU-файлы (это типа как TPU в трубопаскакале или .class в Жабе, но содержит только скомпилированные описания без кода).

            P.S. И да, я в курсе про precompiled headers (PCH) в крестах и в сишке. Но это не то. PCH — это помойка, да и от необходимости иметь исходники междумордий оно не избавляет.
            Ответить
            • А как в пкскле решен момент схранением в стеке?

              Всмывсле размер не надо знать?
              Ответить
              • При компиляции твой модуль знает размеры объектов из импортируемых модулей. Он же их берёт из TPU-файлов.

                TPU, DCU, PPU etc. содержат описания всего публичного, но в особом двоичном формате.
                Ответить
                • >> размеры объектов из импортируемых модулей

                  Значит, замена приватного поля с Integer на long приведет к перекопуляции клиентов?
                  Ответить
                  • Именно так.

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

                Распишу немножко подробнее.

                Компилятору нужно получить доступ к полю или к виртуальной функции. Есть два варианта:

                1. Сразу посчитать смещение от адреса начала экземпляра. Для того, чтобы он узнал это смещение, ему надо знать размеры всех предыдущих полей или количество адресов всех предыдущих виртуальных методов. Причём пофигу, публичные они или приватные, нужно знать тупо сумму размеров.

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

                2. Можно доверить подсчёт смещений линкеру. Но тогда придётся хранить экземпляры в секции .data. Ну типа если у нас есть class Pituh {int field_1, field_2;}; Pituh obj, то хранить obj.field_1 и obj.field_2 как отдельные переменные. Кстати, что делать, если хранить нужно в стеке или в куче?
                Ответить
                • > подсчет смещений линкеру
                  По идее достаточно добавить в него новый тип релока - "прибавь сюда значение символа".
                  Ответить
                  • На правах офтопика.

                    На линкеры иногда возлагают решение проблемы, но уже не с классами, а с крестошаблонами:
                    https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html

                    Борманд C++ для этой цели в OMF генерировал запись типа COMDEF (у неё есть аналог в COFF и в других форматах). Линкер, если встречал в разных модулях записи типа COMDEF с одинаковым именем, накладывал их друг на друга. Т. е. из одинаковых COMDEF-записей выживала одна. Причём изначально COMDEF изобрели не ради крестошаблонов, а ради блока Фортрана COMMON (отсюда и название).
                    Ответить
            • precompiled headers же это просто дерево синтаксическое построенное, чтобы по 30 раз не парсить один и тот же stdout.h, включенный в 20 файлов
              Ответить
    • > как вы с этим живете
      Интерфейсик в хедере, унаследованная от него реализация с полями и прочими кишками в цпп. Почти как в жабке.
      Ответить
        • Ну это менее пидерастический вариант нежели pimpl, имхо.
          Ответить
          • Огласите всю шкалу пидерастичности, пожалуйста.
            Ответить
      • а как клиент получает инстанс? Через фактори метод?
        Ответить
        • Да. Когда всё на шаред поинтерах - вполне терпимо. Да и те же моки для тестов легко прикрутить.
          Ответить
          • иными словами публичные конструкторы не нужны?
            Ответить
            • А чем фабричный метод не публичный конструктор?

              Ну на стеке такой объект уже не создашь, да. Но для высокоуровневых классов в общем-то и похуй, особенно если shared_from_this нужен.
              Ответить
              • >>А чем фабричный метод не публичный конструктор?
                ну там нет ключ слова new:)

                Я с жабоёбносишарпным бекграундом, у нас явно различают конструктор и фабр метод
                Ответить
                • > различают конструктор и фабр метод

                  В жабе вообще конструкторы considered harmful. В крестах от них хоть практическая польза есть.
                  Ответить
                  • Это почему?
                    Потому что в них ты не можешь ни на что повлиять (ни пул не сделать, ни постпроцессинг никакой для объекта, чтобы не породить leak of this)?
                    Ответить
                    • Effective Java, 2ed

                      Item 1: Consider static factory methods instead of constructors

                      Там много интересного написано.
                      Ответить
                      • Я помню что половина Effective Java состоит из "мы сделали так, но вы никогда так не делайте". Там про writeObject, многострадальный Date изменяемый итд

                        про конструкты не помню (надо перечитат) но почти наверняка там написано про то, что нельзя сделать пул например, а надо всегда новый отдавать

                        удивительное дело: джава обосралась со всем. С конструкторами, с assertами, с Date, с checked exceptions. С чем она не обосралась?
                        Ответить
                        • > С чем она не обосралась?

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

                          А в языке ещё много эпичного: кривая вариантность массивов (позорный ArrayStoreException) из-за отсутствия женериков в первых версиях, впоследствии слабенькие женерики, отсутствие тайпдефов, жуткий бойлерплейт с equals/hashCode, хоть какая-то модульная система лет через двадцать лет зарождаться начала, etc, можно долго список продолжать.
                          Ответить
                          • Пузя, ты так говоришь как будто ты жаву с 1.0 застал.
                            Ответить
                            • Застал тебя с твоей мамкой в постели. Теперь у нас одинаковый набор половых инфекций. Проверься.
                              Ответить
                            • Я застал жаву 4, там всё ОЧЕ хуево

                              вообще говоря до восьмерки все и было хуево
                              даже до девятки
                              Ответить
                              • > там всё ОЧЕ хуево
                                В четвёрку же даже memory model ещё не завезли?
                                Ответить
                                • Завезли, но хуёвую, сильно мешающую многим оптимизиациям

                                  Нормальное появилась в пятерке

                                  В четверке так же не было генериков, локфри алгоритмов, автобоксинга и много чего еще
                                  Ответить
                                • 3ачем нужен референс на rvalue или число?

                                  const int& petux = 42;

                                  Неужели чтобы передавать куда-то ссылку а не интегральный тип? Неуежели ссылка настолько меньше иного интегрального типа? Что за битоебство?

                                  Под капотом там же создается
                                  const int tmp_petux = 42;
                                  const int& petux = tmp_petux
                                  так?
                                  Ответить
                                    • На всякий случай:
                                      <?php
                                      function P($x) {if (is_int($x)) $x=chr($x); print($x);}
                                      define('_', ord('_'));
                                      define('l', ord('|'));
                                      $R=10; $C=10; $u=0;
                                      
                                      for(;P("\n"),$R--;P("|"))for($e=$C;$e--;P(_+($u++/8)%2))P(l+($u/4)%2);


                                      https://ideone.com/CsuHVx
                                      Ответить
                                  • > Неужели чтобы передавать куда-то ссылку а не интегральный тип? Неуежели ссылка настолько меньше иного интегрального типа?

                                    Ссылка (обычно) больше инта, поэтому толку передавать ссылку вместо значения никакого. Разве что где-нибудь в шаблонах, чтобы не выпендриваться с оптимальной передачей аргументов
                                    template <class T>
                                    void read_value(const Config& config, T& destination, const T& def);
                                    
                                    read_value(config, my_field, HUGE_OBJECT);
                                    read_value(config, my_int_field, 0);
                                    Ответить
                                    • Ага, значит мы принимаем ссылку на T, и T может быть как интом так и объектом на 20 мегабайт

                                      Это я понимаю

                                      Но я не понимаю зачем ссылку-то создавать явно.

                                      Ты вот написал 0, и он превратился во временную автоматическую переменную, и ссылка на него туда передалась

                                      ты же не писал явно

                                      const int& foo = 0;
                                      read_value(config, my_int_field, foo);

                                      Вот мне интересно когда бывают кейсы когда реально надо писать

                                      const int& foo = 0;
                                      Ответить
                                      • > Вот мне интересно когда бывают кейсы когда реально надо писать
                                        > const int& foo = 0;

                                        Практического смысла в этом, кмк, нет. Я такого ни разу не писал.
                                        Ответить
                                        • придумал такой кейс

                                          const int& foo = bar ? 1 : 42;
                                          read_value(config, my_int_field, foo);
                                          Ответить
                                          • > придумал такой кейс
                                            > const int& foo

                                            Я бы такого точно не написал, можно просто

                                            const int foo = bar ? 1 : 42;
                                            Ответить
                                            • А можно вот всю эту хуйню как-то на "PHP" перевести?
                                              Ответить
                                            • а, ну да, зачем плодить темповую переменную если можно сделать явную, и при передаче ее референс возьмется автоматически
                                              Ответить
      • Тут еще зависит от того, что мы делаем. Библиотеку, которая должна поддерживать ABI от версии к версии, обычную программу, или перформансно-критичный класс с семантикой значения.
        Ответить
        • Ну для пирфомансно-критичного вариантов особо и нет - все кишки отправляются в хедер. Иначе аллокация в куче неизбежна.
          Ответить
          • Хочу развить эту мысль
            http://govnokod.xyz/_25024/#comment-398475

            Пусть в petux.o содержится знание о классе Petux и его размере
            пусть client.cpp создает его на стеке, в момент создания считывает его размер и делает alloca
            почему так нельзя?
            Ответить
            • Потому что страуструп в своё время об этом не думал, а теперь совместимость не даст язык переделать.
              Ответить
              • В первых сях тоже не было алохи, и переменные надо было явно вначале все указывать


                чует мое сердце что в те далекие времена размер стека надо было всегда знать статически, может быть копеляторы тогда не умели наче
                Ответить
            • Получился pimpl с alloca:
              // pituh.h
              class pituh {
              public:
                  pituh(void* f, int x);
                  ~pituh();
                  void kokoko();
              
                  static const size_t size;
              
              private:
                  struct fields;
                  fields* m_f;
              };
              
              // pituh.cpp
              struct pituh::fields {
                  int x;
              };
              
              const size_t pituh::size = sizeof(pituh::fields);
              
              pituh::pituh(void* f, int x) : m_f(static_cast<pituh::fields*>(f)) {
                  m_f->x = x;
                  std::cout << "pituh::pituh(" << m_f->x << ")" << std::endl;
              }
              
              pituh::~pituh() {
                  std::cout << "pituh::~pituh(" << m_f->x << ")" << std::endl;
              }
              
              void pituh::kokoko() {
                  std::cout << "pituh::kokoko(" << m_f->x << ")" << std::endl;
              }
              
              // client
              pituh p(alloca(pituh::size), 42);
              p.kokoko();
              Обмазывание макросами оставим читателю в качестве испражнения упражнения.
              Ответить
              • З.Ы. Вместо static_cast надо бы new (f) fields и в деструктор добавить m_f->~fields();
                Ответить
    • Поля — это херня, это всё можно понять и даже не напрягает.

      Вот приватные методы в интерфейс совать — ну совсем не камильфо (понятно, почему так, но причина уж больно уныла).

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

        >> использую статические функции в .cpp файле
        типа Pitux.cpp
        static void pitux::coco(pitux& petux)
        {
        cout << petux.name;
        }

        да, звучит логично
        Ответить
        • Роман имел в виду примерно такое:
          static void coco(const std::string& name) { std::cout << name; }
          Ответить
        • > >>понятно, почему так, но причина уж больно уныла)
          клиенту нужно выделить место для укозателя на функцию, верно?

          щито? я говорю о
          class Курочка {
            private:
              void СнесиЯичко() const; // Вот нафига оно в интерфейсе?
          };
          > типа

          Нет, так не сработает, name-то (предположительно) приватный.
          Ответить
          • >>щито?
            Почему в C++ нельзя так:

            Petuh.hpp
            class Pethu{}


            Petuh.cpp
            private Pethu::someFunc(){}

            ?

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

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

            Если для полей это имеет какой-то смысл (потому что они влияют на размер объекта) то для методов в этом смысла нет.

            Методы же лежат в секции .code а не в стеке клиента:)

            Но я почему-то подумал (по молодости и неопытности) что каждый метод в классе представлен указателем на функцию.

            Теперь я понимаю что это, скорее всего, не так, во всяком случае для приватных методов.

            Потому я ляпнул про указатели, а ты меня не понял.

            Выходит что никакого практического смысла в приватных методах в интерфейсе нет, это чистая блажь.
            Ответить
            • Немного поправлю.

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

              Невиртуальные хранятся и вызываются так же, как функции (единственное отличие — неявная передача this дополнительным аргументом).

              Виртуальные же методы вызываются не напрямую, а через указатель, хранящийся в таблице виртуальных методов (VMT). Чтобы извлечь из VMT нужный указатель, нужно знать его порядковый номер (смещение от начала таблицы).
              Ответить
              • Я еще маленький, так что спрошу в лоб: а приватный виртуальный метод зачем нужен?

                зы: а vtbl где хранится?
                Ответить
                • охебать
                  в крестах можно переопределить приватный метод!
                  в жабе нельзя

                  прочитал что vtbl храница в объекте

                  тогда понятно: чем больше вирт методов тем жырнее абъект
                  Ответить
                  • > а приватный виртуальный метод зачем нужен?

                    Гугли NVI idiom

                    > прочитал что vtbl храница в объекте

                    Где прочитал? Враньё это. В объекте указатель на неё хранится.
                    Ответить
                    • >>вранье
                      вижу теперь: The vtables themselves are statically allocated somewhere in your address space.

                      Тогда я не понимаю почему добавление метода в эту таблицу должно как-то волновать клиента класса

                      >> NVI idiom
                      это у нас называется template method жэ, просто в жабе он должен быть protected а не private
                      Ответить
                      • > Тогда я не понимаю почему добавление метода в эту таблицу должно как-то волновать клиента класса


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

                      В С++ же нету манкипатчинга как в скриптовых ЯПах когда у конкретгного объекта можно заменить метод?
                      Ответить
            • > это чистая блажь

              Техническая причина есть, но от этого не легче.

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

              А вот содержимое классов и структур компилятор обрабатывает в два прохода, поэтому реализации методов могут вызывать другие, ещё не определённые (и даже не объявленные!) методы. Когда компилятор видит реализации метода, он смотрит на всю декларацию класса (и только туда), чтобы узнать контекст.

              Из-за этого декларация класса/структуры должна содержать все методы класса, включая приватные.
              Ответить
              • Но почему нельзя разнести декларацию на два файла, как partial class в C#?

                Условно говоря:

                // Petuh_Public.h
                partial class  Petuh {
                 public:
                 void publicFunction();
                }
                
                // Client.cpp
                #include <Petuh_Public.h>
                // компилируя этот файл я вижу publicFunction, и мне ок
                
                
                
                //PetuhImpl.cpp
                //компилируя этот файл я вижу privateFunction.
                // Она больше никого кроме меня не волнует
                #include <Petuh_Public.h>
                partial class  Petuh {
                 private:
                 void privateFunction();
                }
                
                void Petuh::privateFunction(){/*...*/}
                void Petuh::publicFunction() {
                 this->privateFunction();
                }



                Например в Objective C так можно.
                // Petuh.h (словом interface они называют декларацию)
                @interface Petuh 
                  - (void)publicMethod;
                @end
                
                // Petuh.m (в .m файле реализация)
                @interface Petuh //расширяем интерефейс
                  - (void)privateMethod;
                @end
                
                // реализация
                @implementation Petuh
                - (void)publicMethod {
                
                }
                
                - (void)pivateMethod {
                
                }
                @end
                Ответить
                • Если я не ошибаюсь, то в Objective C, как и в смоллтолке, совершенно другая идеология: там все вызовы направляются не сразу на конкретные методы (как в крестах), а сначала на диспетчер (который для экземпляра общий для всех методов), а диспетчер уже решает, какой метод вызвать. Тут компилятору о других модулях не нужно знать ничего, кроме способа вызова диспетчера.

                  Хотя стоп! Что передаётся на вход диспетчеру?
                  Ответить
                  • Что-то типа такого:
                    NSInvocation
                    https://developer.apple.com/documentation/foundation/nsinvocation

                    Указатель на метод, Таким образом, выглядит так:
                    https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

                    Это позволяет делать всякие лулзы типа
                    * юзать патттерн command из коробки
                    * сделать catch all метод
                    * форварднуть вызов в другой объект легко сделав делегацию
                    * спросить объект "отвечаешь ли ты на такой метод" (respondsToSelector)

                    Подобная идеология (метод есть не вызов функции а посыл месседжа) есть еще у руби. Кто-то где-то писал что дескать С++ взял подход из симулы, а objc и руби у смоллтока

                    Логично предположить что работает это не так быстро как vtable и уж точно не так быстро как обычный вызов невиртуальной функции
                    Ответить
                    • >> At runtime, you use the NSSelectorFromString function, where the string is the name of the method:
                      SEL aSelector = NSSelectorFromString(@"methodName");


                      Значит, в Objective C (в отличие от крестов) runtime type info является не опциональной нагрузкой, а обязательной. Царю точно не понравится.
                      Ответить
                      • Ну я уже понял что в крестах только смещения внутри таблицы виртуальных методов есть

                        клиент:
                        вызови четвертый метод у петушка

                        а у петушка указатель на vtable класса ПитушокЗолотойГрибешок в котором под номером 4 лежит указатель на .code где этот метод у него реализован

                        Это в виртуальном случае, а в невиртуальном там прямо CALL и адрес или inline

                        Objective C (как и руби как и смолток) никогда не говорили что они царские языки

                        Зато там можно было спросить у объекта "хочешь обработать такой-то вызов метода?" и если он говорил "хочу" -- делегировать его
                        Ответить
                        • Кинул твоему объекту message, проверь.
                          Ответить
            • Вспомнил ещё одну причину: можно объявить кого-нибудь friend, и у него появится доступ к приватному интерфейсу.
              Ответить
              • Получил доступ к твоему приватному интерфейсу. Проверь.
                Айкы-ы-ы-ы-ы -_-
                Ответить
          • >// Вот нафига оно в интерфейсе?

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

              приватный метод интерфейсом класса семантически быть не должен
              Ответить
              • >Мы уже выяснили что в интерфейсе ничо не храница
                Ебать, какое открытие...
                Ответить
                • Возможно, вам будет интересно узнать, почему в методе класса независимо от числа заявленных параметров на один параметр больше, причём он неявный.

                  >прочитал что vtbl храница в объекте

                  {facepalm}
                  Ответить
                  • параметр на th начинается, на is кончается?

                    >>{facepalm}
                    дочитайте ветвь до конца
                    Ответить
                      • все мы когда-то чего-то не знали...
                        Ответить
                        • Такое ощущение, что участники здест когда-то были суперпрофи, но потом порастеряли свои знания и теперь вновь повторяют букварь.
                          Ответить
                          • Злая фея заставила их многие лета писать на скриптоговне и они все позабывали
                            Ответить
                            • ПРИШЛО ВРЕМЯ НАПИСАТЬ ГОСТЕВУХУ
                              ГОСТЕВУХА САМА НЕ НАПИШЕТСЯ
                              НАПИШУ ЕЕ НА PHP+MYSQL+AJAX
                              ЗАЧЕМ МНЕ НУЖНЫ RAILS/ASP, У МЕНЯ НЕТ ВРЕМЕНИ ЧТОБЫ ЕБАТЬСЯ С НИМИ
                              ЛУЧШЕ ЕЩЕ РАЗ ПРОЧИТАЮ PHP&MYSQL РУКОВОДСТВО ПРОФЕССИОНАЛА
                              Я ЧИТАЮ PHP&MYSQL РУКОВОДСТВО ПРОФЕССИОНАЛА ПО 3 РАЗА В ДЕНЬ
                              КАЖДЫЙ INДEX.PHP ЗАНИМАЕТ ДВАДЦАТЬ СЕКУНД
                              Я ЖИВУ АКТИВНОЙ И ПОЛНОЦЕННОЙ ЖИЗНЬЮ
                              Я УСПЕШЕН И ПОЭТОМУ ЦЕЛЫЙ ДЕНЬ СИЖУ НА ФРИЛАН.СРУ
                              ПИШУ ЗАКАЗЧИКУ ЗДЕЛАЮ ЗА ОТЗIВ
                              ГОТОВЫЕ ГОСТЕВУХИ ЗАЛИВАЮ НА UCOZ
                              ТУПЫЕ ДЖАВАМРАЗИ ОДЕРЖИМЫ EJB
                              А Я СВОБОДНЫЙ ОТ ЗАДРОТСТВА ЧЕЛОВЕК
                              <?PHP ECHO 'HEЛЛO WOЯLD' ?>
                              $SUM = ($N & ($N % 2 ? 0 : ~0) | ( (($N & 2)>>1) ^ ($N & 1) ) );
                              ЛУЧШЕ Я ЕЩЕ РАЗ СОСТРЯПАЮ ГОСТЕВУХУ
                              И ЗАБУДУ ПРОВЕРИТЬ НА XSS И ИНЪЕКЦИИ
                              Я НЕ ЧИТАЛ PHP&MYSQL РУКОВОДСТВО ПРОФЕССИОНАЛА УЖЕ НЕДЕЛЮ
                              ПОЙДУ ПЕРЕЧИТАЮ
                              В PHP ВСЕ ПРОСТО И ПОНЯТНО
                              Warning: Cannot send session cache limiter - headers already sent
                              ЭТО ЖЕ ОЧЕВИДНО КАК ЕЕ РЕШИТЬ
                              ПРОПИШУ В СКРИПТЕ ERROR_REPORTING(0)
                              КОКОКОКОКОКОКО
                              PHP — САМЫЙ ЛУЧИЙ ЯЗЫК ДЛЯ ВЕБ
                              КОКОКОКОКОКОКО
                              Ответить
                              • Да не писали раньше сами, уже год как есть сраный распиаренный Backbone. И он не первый. Добавили только изкоробочную синхронизацию данных с нодоподелкой.

                                Просто веб-макачье в очередной раз ткнули носом в MVC и паттерн observable, заодно пустив на этом волну пиара. До этого макачье не могло в простейший pubsub на 10 строчек и вместо нормального кода хуярило полнейшее спагетти из вкусной копи-пасты.

                                А все почему? Потому что веб-макака — не программист, а отброс, которого надо тыкать носом, пока оно не научится хоть что-то делать. Но себя макаки считают ниибаться авангардом всея технологий, поэтому ткнуть им в «мудоебы, 30 лет назад придумали Smalltalk, смотрите, блядь, как вот это говно делается просто и по-уму» нельзя (всяких штуденческих диссеров с «мы припрем в веб-браузер концепт actor'ов» было и 5 и 7 лет назад — все до единого забыты нахуй), им надо КУКАРЕКУ ПРОРЫВ В ВЕБ-РАЗРАБОТКЕ НОВЫЕ ТЕХНОЛОГИИ КОКОКО ИННОВАЦИОННЫЙ ДИЗАЙН ИСПОЛЬЗУЕТСЯ В ЛИДИРУЮЩИХ СТАРТАПАХ ДАСТИН МОСКОВИЦ ОДОБРЯЕТ КУДАХ-ТАХ-ТАХ NODEJS WEBSOCKETS HTML5 MOBILE RESPONSIBLE WEB DESIGN HATEOAS MONGODB. Тогда они обращают внимание и начинают кое-как пользоваться.
                                Ответить
                                • Позвольте разъяснить вам несколько моментов: а) Большинство людей, которые делают сайты – не программисты. Если вы хотите делать сайты, но не хотите быть программистом – берите в зубы учебник «PHP5 в подлиннике» и начинайте делать свою первую гостевуху. Вопросы решайте в гугле, /s/ и форумах. Здесь другая тематика. Эту пасту дальше читать не надо, мы будем долго разговаривать, а вам нельзя терять время. б) За 21 день освоить программирование не получится. Никак. Совсем. Если срочно нужны деньги, то присоединяйся к товарищам, которые встали и ушли после пункта а. Нормальный объём академических часов в высшем образовании – 8000 штук
                                  Ответить
                                  • На похапэ можно писать довольно быстрый код. Конечно, не такой резкий, как заточенный под конкретную задачу инстанс nodejs или, не дай бог, что-нибудь для веб на няшной с ассемблерными вставками.

                                    Можно банально придерживаться паттерна mvc и не погрязнуть в паутине спагетти-скриптов с сотнями инклюдов. Код будет хотя бы структурирован и изолирован локальными кучками говнеца. Это идеальное состояние, если большую часть рабочего времени вы добавляете в общую свалку новые, независимые друг от друга конвертики с тухлятиной.

                                    Можно написать классы объектов, там где они необходимы и наполнить их методами. Опять же, всё ради структурирования кода, для вполне сносной и быстрой навигации по разрастающейся выгребной яме проекта.

                                    Можно вооружиться профайлером, раскурить исходники ядра фреймворка, который вам предписало начальство, и частично переписать его, снизив время выполнения этого хитросплетения пиздеца на 80%. Вырезать конфиг веб-приложений, сделанный в xml. Уничтожить миллионы вызовов __call() и call_user_func(), от которых кровоточат глаза. Большинство макак знает, что обычное веб-приложение на похапэ инициализируется каждый раз с нуля. Поэтому уменьшить на 90% время инициализации - это очень хорошая идея.
                                    Ответить
                                    • Знаете, некоторые печальные даты надолго остаются в памяти людей: 11 сентября, 17 августа, 1917-й год, 1941-й. К ним стоит добавить 1995-й - год появления JavaScript, PHP, Ruby, ну и Java тоже. Кому-то захотелось по-быстрому добавить динамизма в веб-странички, и он за пару недель наговнякал интерпретатор, встроив его в браузер Netscape. Кому-то захотелось оживить свою домашнюю страничку, добавить счетчик посетителей, еще что-то, и он на коленке сделал такой вот изменятель страничек на стороне сервера. О больших проектах тогда никто не думал, personal home page назывался тот изменятель. А когда делаешь интерпретатор, проще всего сделать его на динамической типизации. Это банально очень просто. О системе типов вообще можно не задумываться, не говоря уже об их выводе. К сожалению, на фоне тогдашнего мейнстрима (Си, ранние плюсы, что там еще было?) эти скриптовые языки выглядели очень выигрышно, писать мелкие куски кода на них было намного проще.
                                      Ответить
                                      • А чо началось в 1917? Я думал первая мировая война раньше началась.
                                        Ответить
                                        • 1 июля
                                          Смещён со своего поста президент Китая генерал Ли Юаньхун
                                          Ответить
                                          • Я считаю, что разработчик - тот кто может решать практические задачи и получать за это деньги. Ильхам Зюлькорнеев - разработчик. Павел Дуров - разработчик. Борис Нуралиев и Евгений Касперский - разработчики. А /c/ целиком состоит из теоретизирующих задротов, которые никогда не достигнут таких высот и не заработают столько денег, как Паша или Ильхам.

                                            Причем фундаментальная ошибка заключается в отнесении себя к некой категории "небыдла". Дело в том, что разработка ПО никогда не являлась самоцелью. Использование небыдлоязыка или красивого архитектурного решения оправдано до тех пор, пока его применение находит отражение в потребительских качествах продукта, и имеет тем большую ценность, чем большей аудитории улучшение потребительских качеств будет доступно и понятно. Т.е. я хочу сказать, что продукт должен быть наоборот максимально быдло-ориентирован, учитывать его интересы, сделан под него. Это касается и разработки средств и библиотек, а также к выбора средств разработки. CMS система, написанная на PHP и работающая на нищебродских хостингах обладает гораздо большим рыночным потенциалом, чем какая-нибудь астральная фигня на лисповском uncommon web-е. Если эта еще и интегрируется с 1С а также имеет маркетинговую поддержку от производителя, но позволяет разработчикам самостоятельно зарабатывать на лицензиях (т.е. получать деньги фактически ничего не делая) - то её потенциал еще выше. Деньги всегда были и будут в "быдло-технологиях", то, что произошло с Viaweb (кстати, "илитность" его заключаась только в выбранном языке, сам проект - типичное веб-говно для быдла) - нелепая случайность, одна на весь мир, возникнувшая на перегретом американском IT-рынке до краха доткомов. Так что учите PHP и 1С, вся ваша математическая хуита и небыдлоязыки никому даром не нужны.
                                            Ответить
                                            • ПЫХОПЛЕЯДУ (Perl, PHP, Python, Ruby). ПЫХОПЛЕЯДА - это высеры ГСМ-ов и неграмотных долбоебов, которые проделали большую работу изобретя колесо (квадратное) - чукча не читатель, блеать. Пыхоплеяда состоит из протопыха (слишком переподвыподвывернут для петушков, известно, что новейшую версию первоначально удалось реализовать только на хаскеле), пыха - классика гостевушного жанра, гвидопыха и джапопыха. При этом, если гвидопых отличается от пыха только ЧСВ гвидопыхеров, упивающихся своей невъебенной илитностью, и наличием у хуесосов харизматичного фюрерка, то джапопых действительно несколько более продвинут, и в мокрых фантазиях джапопыхеров является смолтоком. Знатоки пыхоплеяды лепят гостевухи за доширак и заправляют картриджи.
                                              Ответить
                                              • Молодец, соси конец
                                                И садись на огурец,
                                                Ылитный гвидопыховец.
                                                Ответить
                                            • Объясните, что в пасте не так? Обидно, что на пыхе можно зарабатывать, а на хаскелле/лиспе - нет?
                                              Ответить
                                              • А нахера здесь вообще эта паста? Обидно, что для того, чтобы зарабатывать на Haskell или LISP, нужно иметь учёнуйу степень?
                                                Ответить
                                                • Паста для того, чтобы люди видели разницу, между полезными занятиями и суходрочкой долбоёбов из /pr/.
                                                  Ответить
                                                  • Кто больше долбоёб? Тот, кто ради своего удовольствия пишет на языке который ему нравится, или тот кто тратит своё время на постинг копипаст и "просвещение", как он считает, долбоёбов?
                                                    Ответить
                                                    • Самый большой долбоёб - тот, который занимается суходрочкой и показывает ее как что-то важное. Остальные долбоёбы всего лишь бесполезные, а этот - вредоносный. Да, просвещение не долбоёбов, а потенциальных жертв этих петухов. А ты чего триггернулся?
                                                      Ответить
                                                • Из колхозной молодёжи
                                                  Хойцкелял один лишь я,
                                                  Кобенировал я типы
                                                  И кар-ри-ро-ва-ни-я!
                                                  Ответить
                                              • >>Обидно, что на пыхе можно зарабатывать, а
                                                Я УСПЕШЕН И ПОЭТОМУ ЦЕЛЫЙ ДЕНЬ СИЖУ НА ФРИЛАН.СРУ
                                                ПИШУ ЗАКАЗЧИКУ ЗДЕЛАЮ ЗА ОТЗIВ
                                                Ответить
      • Меня вот бесит, что если я хочу чужой enum использовать, то forward declaration не пройдет, все равно придется подключать весь хедер. Даже если тип enum имеет не поле (это-то понятно), а аргумент функции.
        Правда, это нужно в основном в слотах. Было бы хорошо написать что-то типа:
        private:
          // Так уже можно
          class QAbstractSocket *m_socket;
        private slots:
          // ???
          void onSocketError(enum QAbstractSocket::SocketError socketError);
        Ответить
        • > forward declaration
          Да пошло оно в жопу. Я лучше PCH включу, чем буду писать эти затычки-вместо-инклудов.
          Ответить
    • Кстати, есть ещё один аспект, из-за которого имеет смысл светить приватными полями: инлайнинг.
      class Курочка {
        public:
          const Яичко& яичко() const { return я_; }
        private:
          Яичко я_;
      };
      Вызов к яичко() компилятор сможет заинлайнить в несколько инструкций. Без знания кишков класса это сложно сделать в клиенте (кросс-модульная оптимизация вроде всегда была говно).
      Ответить
      • В твоем примере дефициния " const Яичко& яичко() " прямо в .h файле?
        Ответить
          • Тогда понятно

            Просто в няшной же так не делают обычно, иначе у нас появится множество дефиниций одной и той же функции в каждом файле, куда его include

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

              В сишке 99 тоже есть inline, проверь.
              Ответить
              • То есть если я не буду брать адрес "яичко()", то и функции то такой не будет в объектниках (везде будет инлайн), а если возьму то функция появится в каждом объектнике (десятки их!) а потом линкер все схлопнет? А как он поймет что это одна и та же функция?

                >>В сишке 99 тоже есть inline, проверь.
                Я знаю, но его надо явно помечать как inline.
                Если этого не сделать то будут одинаковые символы в объектниках и линкер пошлет в жопу: "multiple definition of" же.

                Забвно что в крестах получается такой вот неявный inline.

                Постой. А если я там напишу метод на 20 мегабайт кода, то он везде сам молча заинлайнится?

                Отличный способ стрельнуть в ногу
                Ответить
                • >> А как он поймет что это одна и та же функция?
                  небось одинаковыми будут манглоимена/
                  Ответить
                  • Да. И если реализация этих функций вдруг окажется разной...
                    Ответить
                    • is defined differently in different translation units, the behavior is undefined.
                      Ответить
                  • >>136-я неделя
                    Хорошо демонстрирует сколько времени нужно чтобы овладеть С++
                    Ответить
                • > То есть если я не буду брать адрес "яичко()", то и функции то такой не будет в объектниках (везде будет инлайн), а если возьму то функция появится в каждом объектнике (десятки их!) а потом линкер все схлопнет? А как он поймет что это одна и та же функция?

                  inline гарантирует, что функция будет только одна, если все определения одинаковые https://en.cppreference.com/w/cpp/language/inline

                  Но на вашем любимом вендовозе это не так, если линкуешься с разделяемой библиотекой (dll) в которой есть такая функция.
                  Ответить
                  • Спасибо за ссыл, буду по чаще перечитывать cppref.

                    вот про что Роман говорил
                    "A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is implicitly an inline function."


                    >>Если определения одинаковые
                    If an inline function or variable (since C++17) with external linkage is defined differently in different translation units, the behavior is undefined.

                    А до 17?
                    Ответить
      • Блядь, как всё сложно. Нельзя просто ввести ключевое слово "readonly"?
        Ответить

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

Семь раз отмерь — один отрежь, guest!

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


    8