- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
// Will be chosen if T is anything except a class.
template<typename C> static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
какого хуя?
…его, правда, в стрим вообще выводить нельзя.
Нужно ввести новый синтаксис для задания точного порядка, в котором будут препроцессированы токены:
Здесь препроцессор сделает три прохода: на первом будут препроцессированы токены с приоритетом -1, на втором — с нулевым приоритетом и, наконец, на последнем проходе будет обработан 42-й приоритет.
Таким образом CAT объединит уже препроцессированные x и y без необходимости введения дополнительных макросов, а STR будет возвращать правильное строковое представление x:
ты про него?
P.S. Нагуглил. Если борец, то он в 1991-м только родился.
Это друг нашего Стертора из соседнего государства.
Цхинвал,Республика Южная Осетия — российский борец вольного стиля осетинского происхождения, чемпион Олимпийских игр 2016 в весе до 65 кг, чемпион и призёр чемпионатов России и мира, обладатель Кубков европейских наций, призёр Кубков мира. Капитан Вооружённых Сил Российской Федерации.
Победитель всероссийского турнира на призы Сослана Андиева (2007);
Мало кто знает, но многих осетинов зовут Сослан.
Например, Стертора
https://youtu.be/tUBVEKzsZ-k
Я верно понимаю что там просто device class специальный поверх которого работает драйвер, а все эти WIA, SANE, и TWAIN это просто програмные интерфейсы?
По крайней мере, у моего сканера даже прошивки не было, её заливал драйвер с компа. Для линукса приходилось выковыривать эту прошивку из виндового пакета с дровами.
Интерфейсы чисто программные, да.
и правда
я лох
или он как printer class, то-есть говорит просто "вот порт сканнера" а что туда писать -- это уже проблема драйвера?
некоторые сумасшедшие пытаются использовать его как язык программирования. Получается плохо
https://wandbox.org/permlink/xKirxHNm6Rbx8ePR
https://wandbox.org/permlink/g46U2AeBTyx6Qcqy
А ЗДЕСЬ ТЕКУТ ПО "SFINAE"
Я тебе вот чтоб скажу: чтоб понять SFINAE, надо сначала понять SFINAE. Substitution failure is not an error. Т.е. если подставить в шаблон некие параметры а в результате выходит поеботня, шаблон игнорируется, а не выдается ошибка компиляции.
Другими словами, SFINAE нужен чтоб в некоторых ситуациях игнорировать один шаблон (специально создавая невалидный код) чтоб использовать другой в некоторых ситуациях.
https://wandbox.org/permlink/kQhjVGRHQZRYVbjD
Поэтому я за "обдуманный выбор средств решения задачи".
https://wandbox.org/permlink/Sv1dM02fs4ijHRQn
Конпелятор ругается не на то, что у переменной b нет метода begin, а на то, что подходящая перегрузка не найдена:
И дальше он поясняет за SFINAE:
То есть при поиске перегрузки шаблон был проигнорирован, потому что при подстановке int в качестве T происходит ошибка.
Простое проебываение ссылки типа создать питушка в куче и тутже проебать на него указатель там не канает (копулятор уменьшит счетчик ссылок на питушка и ёбнет его)
А вот так можно и утечь:
Питух ссылается на курочку
Курочка на питуха
Обе ссылки жестские и потому они никогда не осовбодятся (нежетские ссылки не считаются и при смерти питушка превратятся в nil)
У ГЦ такой проблемы нет (остров изоляции), но и там тоже бывает течка, хотя и с другой немного семантикой
При той течке ссылка не проябывается, но некий код приводит к постоянному увеличению дерьма в куче
Свифт течёт, или я не правильно тебя понял? В удаление циклических ссылок сейчас каждый говноязык умеет, даже "PHP".
Так было в Objective C, так же осталось и в Swift.
https://cocoacasts.com/what-are-strong-reference-cycles
Ничего страшного нет, надо просто иногда включать мозг.
Строго говоря даже для языков с ГЦ не плохо бы понимать что там у тебя в куче делается
Поэтому я за "PHP".
а у пыхеров есть только сраный xhprof
там приходится оче много думать про управление памятью.
Если один раз расслабишься то всё, пиздец
Потому там такие штуки на подкорке и таких проблем нет
там физически нельзя потечь памятью, шах и мат
Можно захавать всю оперативку, доступную досовским программам, а потом вызвать функцию «Terminate & stay resident» и остаться в памяти.
Учти только что речь про DOS 1.0 и 8086, так что никаких этих ваших EMS и XMS
P.S. Функция 48H –— выделить блок (BX=кокококоличество параграфов); 49H –— освободить блок (ES=сегментная часть адреса блока).
Но память и так моя, зачем мне это? чтобы саомму себя ограничивать?
Это нужно, например, чтобы при запуске программы из программы (например, system("pause");) дочерней программе этот блок не был доступен.
тоже спросит доса?
Да, в реальном режиме никто не может запретить срать в чужую память, кроме правил хорошего тона.
я же не зря написал про тайни мод
там все сегментные регистры указывают на один и тот же адрес. Я могу только офсетом вертеть
Как по-твоему COM-файлы читали состояние светодиодов Caps Lock, Num Lock, Scroll Lock из нулевого сегмента?
и BDA небось тоже куда-то туда процерировалось далеко
Модель TINY гарантирует только то, что CS=SS=DS на старте программы, а потом ты можешь крутить сегменты, как хочешь (в рамках разумного, конечно, чтобы ничего не сломать).
да, да?
Потом ты можешь честно попросить ещё немного памяти через INT 21H, AH=48H и работать с полученным блоком, а можешь и нагло распидорашивать весь первый мегабайт оперативки, включая код самой «DOS» или, например, shadow copy видеобиоса (чтобы шрифты поменять).
The concept of a memory control block (MCB) was introduced in MS-DOS, Version 2.0
В нашем 1981-м году программист мог управлять всем мегабайтом памяти сам. Просто он должен был знать по каким адресам срать нельзя потому что там железки например.
Или программы в DOS 1.0 использовали только ту память, которую им дали при старте, и больше никуда по соглашению не срали?
Можно конечно намутить свой диспетчер, но там той памяти все равно не хватило бы на две программы.
А так да: Волков коммандер не работает с устаревшими версиями дос))))
http://www.ctyme.com/intr/rb-2939.htm
У доса был execve/StartProcess ахахаха
«European MS-DOS 4.0» –— это многозадачная версия «DOS», выпущенная по заказу «Siemens». Редкая вещь. Ни в файлообменниках, ни в P2P-сетях, ни на компакт-дисках я её не видел.
Как она многозадачная? Кооперативно и без виртуальной памяти?
Для сравнения: «DR-DOS» поставлялся с программой «multitasker». Многозадачность была вытесняющей: программы он переключал принудительно по таймеру. Как было с памятью, не в курсе.
«MS-DOS» поставлялся с графической (но не оконной, а полноэкранной) оболочкой «DOSSHELL». У «DOSSHELL» был ручной переключатель задач: можно было запустить одну программу, поработать в ней, через «Alt+Tab» переключиться на другую, поработать в ней, потом переключиться обратно. Неактивную программу «DOSSHELL» мог высрать в своп-файл, чтобы сэкономить память («одновременно» запущенные программы всё равно друг друга не видели).
И это всё было в реальном режиме (или в V86, если был запущен EMM386). Хотя стоп, дурдосовский мультитаскер (в отличие от «DOSSHELL») работал только с EMM386, значит, виртуальный режим ему для чего-то был необходим.
Какие вообще были способы заглянуть за первый мегабайт?
* A20
* XMS
* EMS
* DPMI
* Dos4GW
что-то еще?
XMS позволял оставлять DOS в реальном режиме и лишь при вызове API кратковременно переключался в защищённый режим, копировал нужный кусок памяти из памяти защищённого режима в память реального режима (т. е. куда-то в первый мегабайт) или обратно, а потом обратно переключался в реальный.
Dos4GW –— это одна из реализаций DPMI (их было море).
Была ещё такая штука:
https://en.wikipedia.org/wiki/DOS_Protected_Mode_Services
Использовалась редкими программами вроде Stacker/Doublespace/Drivespace (сжатие досовских дисков на лету) и некоторыми драйверами мыши.
Они могли быть реализованы и без protected mode (то-есть до 286го, сиречь AT).
Как?
Например посредством карты в ISA разъеме которая имела DRAM память и ROM с реализацией XMS который она инсталлировала в известное прерывание.
Там же бивис шароебился по памяти с шагом в четыре, кажется, K и искал другие биосы по сигнатуре (0xAA55 чи как-то так) и запускал их.
Я слышал про «expansion cards», но вживую их не видел. То ли EMS, то ли XMS как раз и эмулировали API этих карточек.
«Нереальный» режим почти никем не использовался, потому что такие программы были несовместимы с EMS, DPMI и с Windows.
Представляю как первые линуксоиды и бздяшники смотрели на досеров (NT тогда еще не было).
>нт вышла в 93
Да и хуй с ними. Зачем они тебе нужны если и так всю память видно? Ты же не собираешься её делить с другими прогами?
> Windows
А вот тут облом, да. Винда не даст переключиться в protected.
Затем, что программы, которым они потребуются, невозможно запустить в одном сеансе с программами «нереального» режима. Придётся перезагружать компьютер, чтобы перейти от программы одного режима к программе другого режима.
Чтобы не копировать первый мегабайт при каждом переключении контекста?
«Досшелл» не нужно быстрое переключение задач, поскольку там задачи переключаются по запросу пользователя. Он может работать и в реальном режиме, свопуя первый мегабайт на диск.
«Мультитаскер» же с его многозадачностью реального времени должен переключаться быстро, поэтому он переходит в V86 и мапит первый мегабайт для каждого приложения на разные области расширенной памяти. Ему для переключения не надо копировать блоки памяти, достаточно только пошаманить с таблицей дескрипторов.
Была ещё оболочка «GEM», которая тоже была внешне похожа на «Windows 3.x»...
Как-то вот был dos, потом dos с win3.11, а потом сразу win95.
Для таких переменных не нужны фиксапы (потому что смещение фиксировано), если es тоже фиксирован либо вычисляется, а не указывает на саму программу. Поэтому такие переменные можно использовать даже в com-файле.
Модель памяти бройлер сцы я помню, все эти far, near и huge
но почему-то под дос я помню только засирание всей памяти без какой-либоп омощи со сотороны операционки
Я только теперь понял что до DOS 2.0 нельзя было запустить программу из программы, ахахха
Volcov не работао бы
Представляешь файловый менеджер для такой системы?
Конечно это был просто адрес PSP, но все же!
DOS -- многозадачная ОС
но я не крестоблядь, пускай отцы расскажут
Но всё верно рассказал же.
weak_ptr помогает shared_ptr поддерживать граф владения ацикличным.
А из unique_ptr просто не стоит лепить что-то сложнее дерева (т.к. он с weak не взаимодействует).
Блядь, как всё сложно... Именно поэтому я за "C".
Кстати, в 'J' значения всех типов неизменяемые, но можно делать циклические сцылки в локалях или объектах (которые основаны на локалях):
https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members
Это указатель на член класса C.
> Как эта поебота работает?
Магия — в выражении «sizeof(IsClassT<T>::test<T>(0)) == 1». Когда компилятор его встречает — он начинает искать перегрузку метода «test», которая может принять «0».
Сначала компилятор пытается инстанцировать шаблонную функцию «One test(int C::*)» — принимающую указатель на целочисленный член класса C и возвращающую объект типа One.
Если C — это класс, то объявление «One test(int C::*)» валидно, и компилятор рассматривает эту перегрузку. Он видит, что других подходящих перегрузок нет («test(...)» компилятор проигнорирует, поскольку имеется подходящая перегрузка с фиксированным числом параметров), а потому размер выражения «IsClassT<T>::test<T>(0)» будет равен размеру «One».
Если C — это не класс, то объявление «One test(int C::*)» — это ошибка. Однако, по правилу SFINAE, компиляция не упадёт, а компилятор продолжит поиск подходящей перегрузки. Поскольку других объявлений «test» нет, будет выбран вариант с «...», а размер «магического выражения» станет равным двум (sizeof(Two)).
А используется так:
Оно валидно, т.к. 0 кастится к нулевому указателю? А если не класс, то у него не может быть указателя на член?
https://ideone.com/u70mS9