- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
// https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
// The Curiously Recurring Template Pattern (CRTP)
template<class T>
class Base
{
// methods within Base can use template to access members of Derived
};
class Derived : public Base<Derived>
{
// ...
};
> The Microsoft Implementation of CRTP in Active Template Library (ATL) was independently discovered, also in 1995 by Jan Falkin who accidentally derived a base class from a derived class. Christian Beaumont, first saw Jan's code and initially thought it couldn't possibly compile in the Microsoft compiler available at the time. Following this revelation that it did indeed work, Christian based the entire ATL and Windows Template Library (WTL) design on this mistake.
А какая ошибка по-вашему положена в основу всего дизайна языка C++?
j123123 06.02.2019 20:53 # +5
Может суть языка C++ это использование (открытие) каких-то ебанутых багофич, по поводу которых даже возникают сомнение, соберется ли вообще это говно, или нет?
j123123 06.02.2019 20:55 # 0
Rooster 07.02.2019 13:22 # 0
Rooster 07.02.2019 13:22 # 0
guest8 07.02.2019 13:44 # −999
Rooster 07.02.2019 13:25 # 0
guest8 06.02.2019 20:57 # −999
bootcamp_dropout 06.02.2019 21:19 # +1
"It was not any particular function, but the number of them. Bjarne is personally responsible for reducing the number of components in STL by a factor of two. He was trying to make it as small as possible to placate the opposition. "
http://www.stlport.org/resources/StepanovUSA.html
В с++17 добавили приснопамятные функции Бесселя.
Главная проблема дизайна с++ - это желание угодить всем, что вытекает в очень противоречивые и политически ангажированные решения по поводу добавления новых фич.
PA3yMHblu_nemyx 06.02.2019 21:23 # +3
bormand 06.02.2019 21:27 # +1
bootcamp_dropout 06.02.2019 21:28 # +3
https://www.npmjs.com/package/bessel
gost 07.02.2019 11:12 # +2
1) JS-like: в стандартной библиотеке нет ровным счётом нихуя. Однако присутствует мощный и крайне простой пакетный менеджер с большим архивом библиотек, для использования которого достаточно просто написать «import».
2) Python-like: в стандартную либу напихано огромное количество модулей на любые случаи жизни; сторонние библиотеки нужны гораздо реже и только для сильно специфических (по сравнению с предыдущим пунктом) задач.
3) ГовноC++-like: в стандартной либе нет почти нихуя (а то, что есть — неюзабельное говно). При этом пакетного менеджера тоже нет и не предвидится, а установка сторонних библиотек — ёбанный ад.
j123123 07.02.2019 11:22 # +2
PA3yMHblu_nemyx 07.02.2019 11:44 # +1
4) Вроде пакетный менеджер есть, но всё сломано и нихрена не ставится (Haskell-like).
ASD_77 07.02.2019 14:11 # 0
PA3yMHblu_nemyx 07.02.2019 14:23 # 0
j123123 08.02.2019 09:37 # 0
guest8 08.02.2019 17:55 # −999
Lorip1971 07.02.2019 00:08 # 0
https://www-users.cs.york.ac.uk/susan/joke/cpp.htm
guest8 07.02.2019 00:21 # −999
Lorip1971 07.02.2019 00:29 # +1
gost 07.02.2019 12:56 # 0
s: https://habr.com/ru/company/jugru/blog/438866/
Rooster 07.02.2019 13:05 # 0
guest8 07.02.2019 13:18 # −999
guest8 07.02.2019 13:44 # −999
Rooster 07.02.2019 13:06 # 0
Rooster 07.02.2019 13:07 # 0
Rooster 07.02.2019 13:08 # 0
Rooster 07.02.2019 13:13 # 0
guest8 07.02.2019 13:45 # −999
guest8 07.02.2019 13:15 # −999
PA3yMHblu_nemyx 07.02.2019 13:28 # 0
Rooster 07.02.2019 13:15 # 0
Rooster 07.02.2019 13:15 # 0
PA3yMHblu_nemyx 07.02.2019 13:46 # 0
ASD_77 07.02.2019 14:11 # −1
PA3yMHblu_nemyx 07.02.2019 14:24 # 0
DLL/so чем не поздний линкер?
PA3yMHblu_nemyx 07.02.2019 14:25 # +1
Запросто. *a является синонимом a[0]. Можно явно писать [0] вместо звёздочки.
Rooster 07.02.2019 14:32 # +1
PA3yMHblu_nemyx 07.02.2019 14:35 # 0
И даже так:
Rooster 07.02.2019 14:37 # 0
gueest8 07.02.2019 15:16 # 0
а в другом к нолю прибавил s
от перестановки мест слагаемых...
Rooster 07.02.2019 15:22 # +3
PA3yMHblu_nemyx 07.02.2019 15:24 # 0
Kakou-mo_nemyx 08.02.2019 16:58 # 0
Не по этой ли причине некоторые боятся звёздочки в сишке?
O4epegHou_nemyx 08.02.2019 17:04 # 0
Играю роль, такую роль,
И в этой роли, безусловно, я массив.
Kakou-mo_nemyx 08.02.2019 17:07 # 0
Для кокококонсистентности надо было вместо структур тоже сделать указатели.
O4epegHou_nemyx 08.02.2019 17:30 # +2
Kakou-mo_nemyx 08.02.2019 17:32 # 0
А теперь переставь поля местами.
O4epegHou_nemyx 08.02.2019 17:39 # +3
Kakou-mo_nemyx 08.02.2019 17:47 # +1
Зазоров не будет, если size_t совпадает по размеру с паддингом (обычно достаточно кратности машинному слову) или если указаны директивы для упаковки структуры (#pragma, __attribute__ –— вот это всё).
Что же касается паддинга в самом конце, то обычно такие структуры применяют к уже выделенной памяти, поэтому на sizeof нам плевать.
Но вообще да, какое-то чувство незавершённости остаётся.
guest8 08.02.2019 22:18 # −999
O4epegHou_nemyx 08.02.2019 22:23 # 0
Kakou-mo_nemyx 08.02.2019 22:27 # 0
guest8 08.02.2019 22:27 # −999
guest8 08.02.2019 22:32 # −999
gost 08.02.2019 18:07 # +3
Kakou-mo_nemyx 08.02.2019 18:18 # 0
Kakou-mo_nemyx 08.02.2019 18:20 # 0
P.P.S. Торможу, есть же FileNameLength.
bormand 08.02.2019 18:58 # +1
Запиливаешь шаблонный итератор и хоть няшным с++11 for'ом по этой хуйне бегай.
Это к слову о том, почему я люблю кресты для low-level.
guest8 08.02.2019 19:14 # −999
guest8 08.02.2019 17:53 # −999
guest8 08.02.2019 17:52 # −999
Kakou-mo_nemyx 08.02.2019 19:01 # 0
Верно. Есть даже такой прикол:
Так что в некоторых контекстах массивы действительно есть.
Но вот конструкции вроде [42]petuh, petuh+42 (и для «petuh», объявленного как указатель, и для «petuh», объявленного как массив) и отсутствие разделения указателя на массив и указателя на скаляр сбивают с толку новичков.
Конструкции *petuh и petuh[0] работают одинаково, причём всё в силе как для char *petuh, так и для char petuh[42].
guest8 08.02.2019 19:17 # −999
bormand 08.02.2019 19:19 # 0
Но ведь это не строка, а просто сахарок для массива из чаров с нулём в конце. И это тоже важный момент для понимания сишки.
guest8 08.02.2019 19:22 # −999
bormand 08.02.2019 19:22 # 0
Выбрось свой древний конпелятор. Он протух.
З.Ы. Хм, странно, в сишном режиме даже ворнингов нету на эту херню...
guest8 08.02.2019 19:25 # −999
bormand 08.02.2019 19:29 # +1
guest8 08.02.2019 19:31 # −999
bormand 08.02.2019 19:35 # 0
guest8 08.02.2019 19:40 # −999
bormand 08.02.2019 19:43 # +1
gueest8 08.02.2019 19:52 # 0
А как поменять ключ секции? Линкером?
Как поменять страницу я понимаю, хотя это и не оч секурно
bormand 08.02.2019 19:54 # 0
Линкеру можно сказать: "навесь на эту секцию вот такие атрибуты".
Загрузчик мапает секции так, как ему сказал линкер.
gueest8 08.02.2019 19:56 # 0
bormand 08.02.2019 19:56 # 0
guest8 08.02.2019 20:14 # −999
bormand 08.02.2019 20:24 # −1
Блин, посмотри в доке от соответствующего копулятора. Я флешку паяю, некогда гуглить.
Можешь готовую секцию взять (и подкрутить ей атрибуты при желании). Можешь в новую высрать.
guest8 08.02.2019 20:40 # −999
Kakou-mo_nemyx 08.02.2019 20:36 # 0
> у прыщей
Ну и терминология!
У «gcc» ты можешь указать имя секции, в которую совать переменную. А вот секцию создаёт линкер. Вероятно, ему нужно скормить объектный файл, в котором эта секция уже создана ассемблером.
guest8 08.02.2019 20:42 # −999
Kakou-mo_nemyx 08.02.2019 21:12 # 0
В сишные и крестовые стандарты добавляют всякую всячину, но не стандартизировали прагмы.
В общем, нужно посмотреть две вещи:
1. Какие прагмы есть в разных компиляторах.
2. Какие секции поддерживает загрузчик ОС.
*****
Виндовому загрузчику PE-файлов, если не ошибаюсь, на количество и названия секций насрать. Он смотрит атрибуты каждой секции. Ты можешь, например, создать секцию PETUH с атрибутами R-X и секцию KUROCHKA с атрибутами RW.
*****
В «a.out» количество секций фиксировано: есть .text (r-x, инициализированная), .data (rw, инициализированная), .bss (rw, неинициализированная) с заранее известными всем атрибутами. То есть даже для кокококонстант секции нет.
Если важно защитить константы от исполнения, их кладут в секцию .data (насрав на отсутствие защиты от записи). Если важно защитить константы от записи, их кладут в секцию .text (насрав на отсутствие защиты от исполнения).
*****
В «ELF», как и в «PE», можно создать 100500 секций с произвольными атрибутами.
Kakou-mo_nemyx 08.02.2019 21:35 # 0
У «XCOFF» количество секций произвольно, однако, произвольные атрибуты выставлять нельзя, можно выбирать только стандартные шаблоны (секция типа «.text», секция типа «.data») и т. п.
У «PEF» («Mac OS Classic») такая же ерунда, однако, есть секция для констант, а у «XCOFF» я её не нашёл.
У «Mach-O» («Mac OS X») похоже, что тоже стандартный набор шаблонов, причём шаблоны привязаны к названию. Шаблонов стало больше, но свои атрибуты секции создавать нельзя. Нужно искать секцию с подходящим названием.
У «NE» (16-битные приложения «Windows» и «OS/2») можно создавать произвольное количество секций с произвольными атрибутами (разрешения на чтение, запись, выполнение выставляются отдельно, как и у «PE» и «ELF»).
Kakou-mo_nemyx 08.02.2019 21:39 # 0
1. Можно создать секцию с произвольными атрибутами: «ELF», «Windows», «OS/2».
2. Можно создать секцию, но из заранее заготовленных шаблонов: системы типа «Макоси».
3. Можно только выбирать из готовых секций: «a.out».
Kakou-mo_nemyx 08.02.2019 20:24 # 0
В x64 они дополнительно защищены от исполнения. В x32 без DEP они защищены только от записи.
bormand 08.02.2019 19:48 # 0
З.Ы. Хотя на тех же stm'ках можно снять блокировку с флеша и менять единички на нолики...
Kakou-mo_nemyx 08.02.2019 19:52 # +1
bormand 08.02.2019 19:57 # 0
O4epegHou_nemyx 08.02.2019 19:45 # 0
1024-- 08.02.2019 21:22 # +1
Вы про 42[petuh]?
Кстати, зачем эта питушня нужна? Не могу придумать ситуации, где бы она понадобилась. (Реальной ситуации, а не заседания клуба задротов или "креативных" вопросов на собеседованиях)
gueest8 08.02.2019 21:26 # 0
"оффсет петуха поюс 42"
или
"42 плюс оффсет питуха"
и все
не то чтобы ее как-то специально делали
O4epegHou_nemyx 08.02.2019 21:29 # +1
почему оно тогда во всех компиляторах работает?
1024-- 08.02.2019 21:45 # 0
"оффсет петуха плюс 42 на размер элемента петуха"
или
"42 плюс оффсет питуха на размер элемента 42"
А это уже не симметричная питушня.
O4epegHou_nemyx 08.02.2019 21:48 # 0
guest8 08.02.2019 21:49 # −999
Kakou-mo_nemyx 08.02.2019 22:12 # 0
Для других комбинаций типов слагаемых аналогичной перегрузки нет (есть только сложение скаляров), поэтому к неоднозначности это не приводит.
O4epegHou_nemyx 08.02.2019 22:21 # 0
guest8 08.02.2019 22:23 # −999
O4epegHou_nemyx 08.02.2019 22:27 # 0
bormand 08.02.2019 22:27 # 0
guest8 08.02.2019 22:33 # −999
Kakou-mo_nemyx 08.02.2019 21:53 # +1
guest8 08.02.2019 21:57 # −999
O4epegHou_nemyx 08.02.2019 22:01 # 0
O4epegHou_nemyx 08.02.2019 22:36 # +1
guest8 08.02.2019 22:22 # −999
guest8 08.02.2019 22:23 # −999
Kakou-mo_nemyx 08.02.2019 22:33 # 0
gueest8 08.02.2019 22:34 # 0
guest8 15.02.2019 00:33 # −999
Kakou-mo_nemyx 08.02.2019 19:25 # +1
Сравним, как сделали в «Турбо Паскале», «Delphi» и в более поздних проектах вроде «FPC».
1. Если в функцию передаёшь массив, то пушится не сам массив, а указатель на его копию в стеке («копирующий конструктор»; если передаёшь литерал, то он где-нибудь создаётся и тоже передаётся указатель). Но точно так же он поступает и с другими огромными данными вроде структур.
Если формальный параметр имеет атрибут const, то копирование не производится, передаётся только указатель на оригинал, но при этом статический анализатор проверяет, что функция не изменяет данные по этому указателю. Если формальный параметр имеет атрибут var, то ещё проще: ни копирования, ни проверки. Фактически это концепция ссылки.
Если тип параметра является статическим массивом, то размер передавать не нужно, он известен на этапе компиляции.
Есть более сложные сущности: открытые массивы (array of integer, например), динамические массивы и array of const. В этом случае после указателя на массив компилятор пушит ещё его размер.
2. Если же вызываемая функция должна вернуть массив или структуру, то он выделяет место в стеке под результат и самым последним аргументом передаёт указатель на это место. Т. е. результат живёт там же, где живут локальные переменные вызывающего кода (никакой возни с ручным выделением/освобождением).
Да, эти два приёма по сути являются хаками. Однако, структуры и массивы обрабатываются единообразно.
Steve_Brown 08.02.2019 11:19 # +1
KGeist 25.02.2019 23:44 # 0
guest8 26.02.2019 01:01 # −999
KGeist 05.03.2019 13:52 # 0
gost 11.03.2020 11:14 # 0
guest8 11.03.2020 11:20 # −999