- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
"Сайт о прыщах, 9858 руб./месяц, 1000+ чел/сутки":
https://telderi.ru/ru/viewsite/1356387
"Продам сайт о прыщах, выписано 156 статей, можно собрать СЯ и полностью охватить тему, сайт любит и Гугл и Яндекс, трафик идет одинаково.
Монетизация под эту нишу может быть офферная - с неё я думаю доходы будут выше, чем 10 000 руб. в месяц, я к сожалению опыта работы с офферами не имею, в принципе как и времени на этот проект.
Просадка трафика на графике связана с фильтром от гугла: ранее сайт стоял с неоформленными статьями (без картинок, с битыми ссылками на видео), все переоформили и фильтр был снят. Я тут этот сайт
и купил, пока он был под фильтром.
Ссылки не закупались, но они и не нужны - гугл хорошо ранжирует сайт. Можно сделать перелинковку для увеличения позиций и трафика".
Он забанил моеу учетку (
Могу дать пароль от adrnin'a (123), взамен обещай быть пай-мальчиком и хорошо себя вести, ок?
Ща кто-нибудь купит - а там действительно прыщи.
Например, у меня в файле Pitux.hpp описан класс Pitux.
Разумеется, только его интерйфейс (декларации). Дефиниции у меня в Petux.cpp.
Однако же все поля (включая private!) я тоже должен описать в .hpp. Это и понятно: клиент класса должен уметь посчитать его размер чтобы ложить его в стек (кстати, а для new же тоже должен знать? Там же malloc(sizeof(Petix)) под капотом?))
Однако по сути это означает что я мало того что свечу наружу (пусть и приватно) детали реализации, так еще и инкрементальная копуляция будет мне пересобирать Client.cpp когда я решу переименовать приватное поле в Petuh.hpp !
Воркэрануды все какие-то пидерастические: Pimpl (он же Bridge) предлагает создать кучу кода, например.
Крестобляди, как вы с этим живете?
А что можно было бы добавить в язык, чтобы это решить? Как-нибудь так?:
Тогда sizeof(Cormorant) будет константой времени связывания. Интересно, к чему это приведет...
ИМХО: к динамическому разрастанию стека (типа VLA или alloca), и (вероятно) некоторому пенальти по перформансу и потенциальным StackOverflow.
Но мысль интересная.
Другой вариант ВСЕГДА хранить Cormorant в куче, и брать у него размер (так делает Java кмк)
Однако же в момент компеляции файл ВСЕ РАВНО нужен потому что связовывание хоть и динамическое, а интерфейсы знать надо
но если бубличный ифейс не поменялсо то перекопулировать там не надо, да
полагаю что это потому, что всё в куче
Во Фрипаскале пошли другим путём: исполнимый код стали компилировать в распространённый формат модулей (COFF, чтобы его мог подхватить любой стандартный линкер), а бубличные междумордия (требующиеся при компиляции других модулей) стали сохранять в PPU-файлы (это типа как TPU в трубопаскакале или .class в Жабе, но содержит только скомпилированные описания без кода).
P.S. И да, я в курсе про precompiled headers (PCH) в крестах и в сишке. Но это не то. PCH — это помойка, да и от необходимости иметь исходники междумордий оно не избавляет.
Всмывсле размер не надо знать?
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 (отсюда и название).
Интерфейсик в хедере, унаследованная от него реализация с полями и прочими кишками в цпп. Почти как в жабке.
Ну на стеке такой объект уже не создашь, да. Но для высокоуровневых классов в общем-то и похуй, особенно если shared_from_this нужен.
ну там нет ключ слова new:)
Я с жабоёбносишарпным бекграундом, у нас явно различают конструктор и фабр метод
В жабе вообще конструкторы considered harmful. В крестах от них хоть практическая польза есть.
Потому что в них ты не можешь ни на что повлиять (ни пул не сделать, ни постпроцессинг никакой для объекта, чтобы не породить leak of this)?
Item 1: Consider static factory methods instead of constructors
Там много интересного написано.
про конструкты не помню (надо перечитат) но почти наверняка там написано про то, что нельзя сделать пул например, а надо всегда новый отдавать
удивительное дело: джава обосралась со всем. С конструкторами, с assertами, с Date, с checked exceptions. С чем она не обосралась?
Рантайм силами миллионов человеко-лет более-менее сносный запилили. Енумы более-менее нормальные сделали, жаводок был хорошим введением, ну и систему аннотаций они развили.
А в языке ещё много эпичного: кривая вариантность массивов (позорный ArrayStoreException) из-за отсутствия женериков в первых версиях, впоследствии слабенькие женерики, отсутствие тайпдефов, жуткий бойлерплейт с equals/hashCode, хоть какая-то модульная система лет через двадцать лет зарождаться начала, etc, можно долго список продолжать.
вообще говоря до восьмерки все и было хуево
даже до девятки
В четвёрку же даже memory model ещё не завезли?
Нормальное появилась в пятерке
В четверке так же не было генериков, локфри алгоритмов, автобоксинга и много чего еще
const int& petux = 42;
Неужели чтобы передавать куда-то ссылку а не интегральный тип? Неуежели ссылка настолько меньше иного интегрального типа? Что за битоебство?
Под капотом там же создается
const int tmp_petux = 42;
const int& petux = tmp_petux
так?
https://ideone.com/CsuHVx
Ссылка (обычно) больше инта, поэтому толку передавать ссылку вместо значения никакого. Разве что где-нибудь в шаблонах, чтобы не выпендриваться с оптимальной передачей аргументов
Это я понимаю
Но я не понимаю зачем ссылку-то создавать явно.
Ты вот написал 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;
http://govnokod.xyz/_25024/#comment-398475
Пусть в petux.o содержится знание о классе Petux и его размере
пусть client.cpp создает его на стеке, в момент создания считывает его размер и делает alloca
почему так нельзя?
чует мое сердце что в те далекие времена размер стека надо было всегда знать статически, может быть копеляторы тогда не умели наче
Обмазывание макросами оставим читателю в качестве испражнения упражнения.
Вот приватные методы в интерфейс совать — ну совсем не камильфо (понятно, почему так, но причина уж больно уныла).
Поэтому я зачастую вместо приватных методов использую статические функции в .cpp файле и передаю в них необходимый стейт явно.
клиенту нужно выделить место для укозателя на функцию, верно?
>> использую статические функции в .cpp файле
типа Pitux.cpp
static void pitux::coco(pitux& petux)
{
cout << petux.name;
}
да, звучит логично
static void coco(const std::string& name) { std::cout << name; }
клиенту нужно выделить место для укозателя на функцию, верно?
щито? я говорю о> типа
Нет, так не сработает, 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
Потому что клиент по индексу из таблицы функции вызывает, ему надо знать порядок и кол-во виртуальных функций в классе.
Ну да, логично, она же общая для класса, а не для конкретного инстанса.
В С++ же нету манкипатчинга как в скриптовых ЯПах когда у конкретгного объекта можно заменить метод?
Нет конечно
Техническая причина есть, но от этого не легче.
В неймспейсах (включая корневой) компилятор работает в один проход, поэтому всё нужно декларировать до первого вызова.
А вот содержимое классов и структур компилятор обрабатывает в два прохода, поэтому реализации методов могут вызывать другие, ещё не определённые (и даже не объявленные!) методы. Когда компилятор видит реализации метода, он смотрит на всю декларацию класса (и только туда), чтобы узнать контекст.
Из-за этого декларация класса/структуры должна содержать все методы класса, включая приватные.
Условно говоря:
Например в 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 и уж точно не так быстро как обычный вызов невиртуальной функции
Значит, в Objective C (в отличие от крестов) runtime type info является не опциональной нагрузкой, а обязательной. Царю точно не понравится.
клиент:
вызови четвертый метод у петушка
а у петушка указатель на vtable класса ПитушокЗолотойГрибешок в котором под номером 4 лежит указатель на .code где этот метод у него реализован
Это в виртуальном случае, а в невиртуальном там прямо CALL и адрес или inline
Objective C (как и руби как и смолток) никогда не говорили что они царские языки
Зато там можно было спросить у объекта "хочешь обработать такой-то вызов метода?" и если он говорил "хочу" -- делегировать его
Айкы-ы-ы-ы-ы -_-
Ну ебать, это же ООП. А где по-твоему должен храниться указатель на метод?
приватный метод интерфейсом класса семантически быть не должен
Ебать, какое открытие...
>прочитал что vtbl храница в объекте
{facepalm}
>>{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 — САМЫЙ ЛУЧИЙ ЯЗЫК ДЛЯ ВЕБ
КОКОКОКОКОКОКО
Просто веб-макачье в очередной раз ткнули носом в MVC и паттерн observable, заодно пустив на этом волну пиара. До этого макачье не могло в простейший pubsub на 10 строчек и вместо нормального кода хуярило полнейшее спагетти из вкусной копи-пасты.
А все почему? Потому что веб-макака — не программист, а отброс, которого надо тыкать носом, пока оно не научится хоть что-то делать. Но себя макаки считают ниибаться авангардом всея технологий, поэтому ткнуть им в «мудоебы, 30 лет назад придумали Smalltalk, смотрите, блядь, как вот это говно делается просто и по-уму» нельзя (всяких штуденческих диссеров с «мы припрем в веб-браузер концепт actor'ов» было и 5 и 7 лет назад — все до единого забыты нахуй), им надо КУКАРЕКУ ПРОРЫВ В ВЕБ-РАЗРАБОТКЕ НОВЫЕ ТЕХНОЛОГИИ КОКОКО ИННОВАЦИОННЫЙ ДИЗАЙН ИСПОЛЬЗУЕТСЯ В ЛИДИРУЮЩИХ СТАРТАПАХ ДАСТИН МОСКОВИЦ ОДОБРЯЕТ КУДАХ-ТАХ-ТАХ NODEJS WEBSOCKETS HTML5 MOBILE RESPONSIBLE WEB DESIGN HATEOAS MONGODB. Тогда они обращают внимание и начинают кое-как пользоваться.
Можно банально придерживаться паттерна mvc и не погрязнуть в паутине спагетти-скриптов с сотнями инклюдов. Код будет хотя бы структурирован и изолирован локальными кучками говнеца. Это идеальное состояние, если большую часть рабочего времени вы добавляете в общую свалку новые, независимые друг от друга конвертики с тухлятиной.
Можно написать классы объектов, там где они необходимы и наполнить их методами. Опять же, всё ради структурирования кода, для вполне сносной и быстрой навигации по разрастающейся выгребной яме проекта.
Можно вооружиться профайлером, раскурить исходники ядра фреймворка, который вам предписало начальство, и частично переписать его, снизив время выполнения этого хитросплетения пиздеца на 80%. Вырезать конфиг веб-приложений, сделанный в xml. Уничтожить миллионы вызовов __call() и call_user_func(), от которых кровоточат глаза. Большинство макак знает, что обычное веб-приложение на похапэ инициализируется каждый раз с нуля. Поэтому уменьшить на 90% время инициализации - это очень хорошая идея.
Смещён со своего поста президент Китая генерал Ли Юаньхун
Причем фундаментальная ошибка заключается в отнесении себя к некой категории "небыдла". Дело в том, что разработка ПО никогда не являлась самоцелью. Использование небыдлоязыка или красивого архитектурного решения оправдано до тех пор, пока его применение находит отражение в потребительских качествах продукта, и имеет тем большую ценность, чем большей аудитории улучшение потребительских качеств будет доступно и понятно. Т.е. я хочу сказать, что продукт должен быть наоборот максимально быдло-ориентирован, учитывать его интересы, сделан под него. Это касается и разработки средств и библиотек, а также к выбора средств разработки. CMS система, написанная на PHP и работающая на нищебродских хостингах обладает гораздо большим рыночным потенциалом, чем какая-нибудь астральная фигня на лисповском uncommon web-е. Если эта еще и интегрируется с 1С а также имеет маркетинговую поддержку от производителя, но позволяет разработчикам самостоятельно зарабатывать на лицензиях (т.е. получать деньги фактически ничего не делая) - то её потенциал еще выше. Деньги всегда были и будут в "быдло-технологиях", то, что произошло с Viaweb (кстати, "илитность" его заключаась только в выбранном языке, сам проект - типичное веб-говно для быдла) - нелепая случайность, одна на весь мир, возникнувшая на перегретом американском IT-рынке до краха доткомов. Так что учите PHP и 1С, вся ваша математическая хуита и небыдлоязыки никому даром не нужны.
И садись на огурец,
Ылитный гвидопыховец.
Хойцкелял один лишь я,
Кобенировал я типы
И кар-ри-ро-ва-ни-я!
http://perevod-tekst-pesni.ru/sektor-gaza/tekst-pesni_kolhoznii-pank.htm
Of the collective farm youth pankoval alone I :
I wore leather pants and was dirty as a pig
My papanka to combine three rules did the day
A mamanka out there on the farm, dergaet boobs all day.
Давно я так не уссыкался ...
I was in the umat and sang songs fun .
My path led through the old churchyard
I was sober - I once used ohuel .
Я УСПЕШЕН И ПОЭТОМУ ЦЕЛЫЙ ДЕНЬ СИЖУ НА ФРИЛАН.СРУ
ПИШУ ЗАКАЗЧИКУ ЗДЕЛАЮ ЗА ОТЗIВ
Правда, это нужно в основном в слотах. Было бы хорошо написать что-то типа:
Да пошло оно в жопу. Я лучше PCH включу, чем буду писать эти затычки-вместо-инклудов.
Просто в няшной же так не делают обычно, иначе у нас появится множество дефиниций одной и той же функции в каждом файле, куда его include
Видимо к крестах это можно
В сишке 99 тоже есть inline, проверь.
>>В сишке 99 тоже есть inline, проверь.
Я знаю, но его надо явно помечать как inline.
Если этого не сделать то будут одинаковые символы в объектниках и линкер пошлет в жопу: "multiple definition of" же.
Забвно что в крестах получается такой вот неявный inline.
Постой. А если я там напишу метод на 20 мегабайт кода, то он везде сам молча заинлайнится?
Отличный способ стрельнуть в ногу
небось одинаковыми будут манглоимена/
Нет https://www.youtube.com/watch?v=GldFtXZkgYo
// хоть там речь о крестах, в сишке такой же подход.
Хорошо демонстрирует сколько времени нужно чтобы овладеть С++
inline гарантирует, что функция будет только одна, если все определения одинаковые https://en.cppreference.com/w/cpp/language/inline
Но на вашем любимом вендовозе это не так, если линкуешься с разделяемой библиотекой (dll) в которой есть такая функция.
вот про что Роман говорил
"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?
https://www.telderi.ru/ru/viewsite/1263250
надо брать
ОВЕН, а ты почему не прдаешь сайты?