- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
BYTE1 *GetLanguageCodeString( BYTE1 upper, BYTE1 lower , BYTE1 *lang_idx )
{
int index = 0;
switch(upper){
case 'a' :
switch(lower){
case 'a' : index = 0; break;
case 'b' : index = 1; break;
case 'f' : index = 2; break;
case 'm': index = 3; break;
case 'r': index = 4; break;
case 's': index = 5; break;
case 'y': index = 6; break;
case 'z': index = 7; break;
default: break;
}
break;
case 'b' :
switch(lower){
case 'a' : index = 8; break;
case 'e' : index = 9; break;
case 'g' : index = 10; break;
case 'h': index = 11; break;
case 'i': index = 12; break;
case 'n': index = 13; break;
case 'o': index = 14; break;
case 's': index = 136; break; /* Added in SEIN 2004.04.01 KTJ */
default: break;
}
break;
case 'c' :
switch(lower){
case 'a' : index = 15; break;
case 'o' : index = 16; break;
case 's' : index = 17; break;
case 'y': index = 18; break;
default: break;
}
break;
case 'd' :
switch(lower){
case 'a' : index = 19; break;
case 'e' : index = 20; break;
case 'z' : index = 21; break;
default: break;
}
break;
case 'e' :
switch(lower){
case 'l' : index = 22; break;
case 'n' : index = 23; break;
case 'o' : index = 24; break;
case 's': index = 25; break;
case 't': index = 26; break;
case 'u': index = 27; break;
break;
}
break;
case 'f' :
switch(lower){
case 'a' : index = 28; break;
case 'i' : index = 29; break;
case 'j' : index = 30; break;
case 'o': index = 31; break;
case 'r': index = 32; break;
case 'y': index = 33; break;
default: break;
}
break;
case 'g' :
switch(lower){
case 'a' : index = 34; break;
case 'd' : index = 35; break;
case 'l' : index = 36; break;
case 'n': index = 37; break;
case 'u': index = 38; break;
default: break;
}
break;
case 'h' :
switch(lower){
case 'a' : index = 39; break;
case 'e' : index = 40; break;
case 'i' : index = 41; break;
case 'r': index = 42; break;
case 'u': index = 43; break;
case 'y': index = 44; break;
default: break;
}
break;
case 'i' :
switch(lower){
case 'a' : index = 45; break;
case 'd' : index = 46; break;
case 'k': index = 47; break;
case 'n': index = 48; break;
case 's': index = 49; break;
case 't': index = 50; break;
питушня на switch для распознавания какой-то фигни с буквами
А что такое SEIN 2004.04.01 KTJ?
Что означает SEIN я понятия не имею. А KTJ это имя-фамилия корейского разраба из самсунга, который этот говнокод писал. Kwon TaeJin. [email protected]
https://au.linkedin.com/in/eric-kwon-b129093
https://kr.linkedin.com/in/eric-kwon-b129093
Не какой-то, а ISO, причем не страну, а язык, и уже давно трёхбуквенные, т.к. 2 буквенных не хватат.
А ещё есть ГОСТ (7.75-97, но и 7993-90 тоже был неплох, да), в котором догадались не только альфа, но и нумерик значения проставить языкам.
Я в этом ключе и спросил что за нёх этот SEIN - вдруг у этих разрабов тоже перед глазами была таблица соответствий языка числу.
Ибо так вот взять и перехуярить языки по порядку, чтобы потом патчить её номерами, сломав порядок, при этом не сославшись на некий стандарт, в котором уже эти номера присвоены - это одиозно.
Вообще, это хренота из утекшего исходника прошивки караоке-DVD проигрывателя, судя по всему модель Arirang 3600 HDD (для вьетнамского рынка). И хрень эта построена на самсунговском SoC S5H5002
http://port70.net/~nsz/c/c89/c89-draft.html#2.2.1
Но In both the source and execution basic character sets, the value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous.
Т.е. вполне можно переписать на формулу if (number < 10) return number + '0'; else return '0';
но они ведь не определяют в каком именно числовом пространстве. `a + 1 + 1` не гарантировано будет больше чем `а`. ;-)
ЗЫ вроде же бы уже по определению даже уже групп - самая примитивная структура где сложение вводится - ассоциативность сложения доказывается тривиально.
Требование, чтобы a + 1 + 1 было гарантировано больше, чем а, избыточно.
(switch кстати компилятором оптимизируется в двоичный поиск при определенных условиях)
Это зависит от размера массива. Если это критичное место, в чём я сильно сомневаюсь, я бы померил оба варианта и выбрал тот, что работает быстрее.
> Это зависит от размера массива.
еще зависит от того кто/как поддержку делает. как раз лукапы кодов стран/языков не раз видел что народ делает в лоб линейно.
обоснование простое: список меняется слишком редко, народ забывает об ограничениях структуры данных, и почти каждый второй раз когда надо список обновить лажаются и допускают тривиальные ошибки.
а так как лукапить в общем случае надо крайне редко - раз замапил и сохранил код - то никто и не оптимизирует.
>обоснование простое: список меняется слишком редко, народ забывает об ограничениях структуры данных, и почти каждый второй раз когда надо список обновить лажаются и допускают тривиальные ошибки.
Так надо просто метапрограммирование (кодогенерацию) чтоб было так, что
и чтоб вот куда не добавь какую-нибудь {"hu", "HUI"} то чтоб компилтайм-метушня-кодогенератор потом все пересортировал и сам потом это упаковал сортированно в массив в компилтайме, и чтоб потом оно работало с двоичным поиском как положено, без багов и прочей хуйни. И чтоб гомоиконность!
Индусы какие-то. Наверняка у них код - говно
А назвать "ASS" они видимо не могли, потому что это ЗАД. Хотя вот субтитры ж так назвали...
а на темплейтах+constexpr уже кто пробовал сортировку массивов в компайл тайм делать?
какой то гений уже сваял на 14х крестах:
https://stackoverflow.com/questions/19559808/constexpr-initialization-of-array-to-sort-contents
еще один плюс новых крестов для встроенщины.
>какой то гений уже сваял на 14х крестах:
Для этого не нужно быть никаким гением
http://govnokod.ru/19105#comment307900 мне еще очень давно Antervis сваял сортировку пузырьком на constexpr, ну я конечно же обоссал эту тупую хуйню
>еще один плюс новых крестов для встроенщины.
Это никакой не плюс, учитывая что я это же могу сделать кодогенерацией на Си через printf() или же вообще написать эту кодохуерацио на каком-нибудь питоне и присобачить к этому препроцессор свой.
Да и под нестандартную встроенщину плюсов обычно просто нет, а если и есть, то древнего стандарта
можно. но на кой парится с кодогенерацией, если можно сделать стандартными средствами языка?
> Да и под нестандартную встроенщину плюсов обычно просто нет
это да. но на армах/кайлах есть. и IAR медленно уверенно прикручивает (с++14 для арма (v8.80) этой весной выпустили). глядишь через лет пять в проектах начнет появлятся.
Потому что стандартные средства языка C++ являются говном.
Ну вот представим себе ситуацию, допустим что есть у меня код некоторой встраиваемой СУБД, которая работает полностью в оперативной памяти(на глобальном массиве) того процесса, который эту СУБД использует. Есть функции, написанные на языке Си, которые в СУБД добавляют какие-то записи. У меня допустим программа должна при запуске уже содержать некие записи в этой СУБД.
Т.е. я не хочу каждый раз при запуске дергать кучу каких-то функций, которые бы добавляли мне в глобальный массив кучу нужных при старте записей(от этого программа дольше запускается), я просто хочу иметь уже проинициализированный в компилтайме глобальный массив с готовыми записями. Итак, что мне проще всего сделать:
1. Разбираться в логике работы СУБД, написать какой-то ебанины на C++14 которая бы инициализировала глобальный массив, и работала в компилтайме (при этом мне б пришлось вникать в код СУБД, и разбираться в каких-то кретинских плюсовых говноконстэкспрах и шаблонах, что мне вообще-то совершенно нафиг не всралось)
2. Сделать вспомогательную программу, которая бы на этапе сборки компилировалась, запускалась бы, и дергая много раз функцию добавления записи в БД, инициализировала бы в себе глобальный массив, и из него генерировала бы особый файл startdb.bin и который бы я мог потом конвертнуть в объектник и слинковать уже с основной программой, чтобы этот startdb.bin был виден как глобальный массив
?
я понимаю тебя. я как бы в той же самой луже сижу.
но мне просто радостно что наконец (через Н лет) мне не надо будет изгалятся и мучится с вызовами конструкторов (для статической инитиализации) перед мэйном. что наконец статическая инициализация на 100% статическая. и даже с роскошью компайл-тайм подготовки этих данных.
Как там, в 90х? Небось, тёлки молодые и пиво дешёвое?
З.Ы. Больше всего радует
> в кучах сэйфти и медикал областей
посмотрите сколько стоит мед. оборудование. Какого хуя вы экономите на CPU и RAM, если оно стоит как сука космолёт?
В прошлом году заказывал у своего друга-железячника ("фуллстек" партия готовых изделий по заказанным характеристикам, плата прошивка питание корпус) некие сетевые смарт-девайсы. Сперва мне хотели рассказать, как заебись удобно мне ими будет управлять через modbus, ну максимум - modbus over udp, потом - про то, как код реализации стека tcp может не вместиться в выбранное ими железо (!!!), затем - ну бля, "ну какое удаленное обновление прошивки, ну какие две новые функции, чтобы так работало, надо было чип не за $1 покупать, а за $2". Это при цене-то одного девайса около $1k, да и задачи не стояло усраться в максимальный лоу-енд - так наэкономить на мозгах, чтобы было пиздец всем неудобно, и им, и нам, и никакого запаса.
Это в то время, как по PoE можно 30Вт слать, а аналогов raspberry pi с пердоликсом на борту и в тыщи раз большей памятью и мощью можно за $10-40 накупить, чтобы как сеалекса, хватило надолго!
А ежели вы бы делали китайские игрушки, то там и девелоперо-часо-доллары другие, и размеры партий
Лол. Если видишь шаблонную констекспр метушню там, где можно было обойтись скриптом на питоне - плюй автору в ебало смело. Единственное годное применение констекспров, приходящее на ум - парсинг строки формата и проверка типов аргументов в компайл-тайме в плюсовых аналогах принтфа.
во первый, питон говно.
во вторых, но кой трахатся с чем то внешним, если это делается нативно на самом языке.
constexpr'ы это шаг в сторону решения проблемы инициализации перед мэйном. простыми кодогенераторами ты эту дырку не закроешь.
конкретный пример. в кучах сэйфти и медикал областей, стоят условия что вся память/объекты должны быть проинициализированы/этц перед использованием. на каких уёбищных микроконтроллерах, эта инициализация с легкостью может занимать почти секунду. и это при каждом запуске (которых может быть очень много, потому что энергию экономят тупым выключением). на constexpr'ах 95% этого оверхеда на буте можно избежать - и тем неменее гарантировать корректную инициализацию памяти.
Простым может и не закроешь, а вот сложным - вполне.
Да уж получше крестов или пердла.
Ну, тут двояко. Как язык, питон мне кажется значительно меньшим говном, по сравнению с плюсами (но тоже говно). Но для решения конкретной описанной задачи он является примерно таким же говном, что и плюсы (если рассматривать стандартные плюсовые возможности метапрограммирования). Но если рассматривать возможности кодогенерации, плюсы уже немного меньшее говно, чем питон
Вот посудите: есть у вас какой-то код на Си, код этот напичкан какой-то хуйней, типа malloc, memcpy, указателееблей и прочей ебаниной, которая ничего общего с constexpr и шаблонной еблей не имеет. Перед вами стоит задача - этим кодом проинициализировать в компилтайме какие-то переменные, массивы, структуры. Так вот, по-моему для решения этой задачи оба языка являются полным говном, хотя плюсы в чем-то лучше. Нет, не тем, что constexpr и шаблоны, вы не подумайте. Просто можно написать кодогенератор на плюсах, но это к constexpr-шаблонной метушне никакого отношения вообще не имеет, с тем же успехом можно взять и Си. А у питона тупо нет совместимости на уровне исходного кода с Си
>во вторых, но кой трахатся с чем то внешним, если это делается нативно на самом языке.
Нативные средства метапрограммирования в плюсах являются полным говном, и кодогенерация намного лучше.
да, они пахнут. но они решают реальнуе проблемы.
для каких ниш типа таблиц (со статическими данными) кодогенерация это абсолютно ОК. но для чего-то большего (то чем я больше/дольше всего страдал: C++ FSM генераторы) то там сложность кодогенераторов может быть выше чем сложность остального кода в проекте. и выхлоп генератора (и/или сам генератор) приходится тоже тестировать.
но если у тебя все сводится до пары десятков строк на змие, то я сомневаюсь что ты до (тёмных) высот кодогенерации доходил.
Попробуй Ragel
ты что идиот? это дело резолвится *гарантировано* (иначе компайл ошибко) во время компайла.
это как раз все и упрощает - нет ни какого замудрого эффекта в рантайме. все уже заэвалюировано и лежит в дата/ro-дата сегменте.
Нет
>это дело резолвится *гарантировано* (иначе компайл ошибко) во время компайла.
Если оно гарантировано во что-то отрезолвилось, еще никто не гарантирует что оно отрезолвилось в то, что нужно.
Например, сишный препроцессор тоже гарантировано или что-то там раскроет, или не раскроет и выплюнет ошибку (или на этапе препроцессирования, или же компилятор не сможет прохавать ту хуйню, которая получилась после препроцессирования). Но "безошибочное" раскрытие всякой хуйни через сишный препроцессор совершенно не гарантирует отсутствие багов из-за раскрытия хуйния препроцессором. типичный пример это когда делается что-то вроде
и потом кто-то делает в коде
отчего возникает всякая хуйня, но никакой ошибки раскрытия макросни тут нет, с т.з. препроцессора и компилятора тут все корректно
Да и констэксрпр-код разумеется может содержать какие-то БАГИ, и при вычислении констэкспров может получаться совсем не та хуйня, которую ожидал получить программист. Так вот, каким образом ДЕБАЖИТЬ ТАКОЙ КОМПИЛТАЙМ-БАГ? Куда брейкпоинт ставить?
да, но эти баги идентичны нормальным багам нормального крестового кода.
о дополнительном типе багов - кривое определение макроса и его последствия - задумыватся не надо.
> Так вот, каким образом ДЕБАЖИТЬ ТАКОЙ КОМПИЛТАЙМ-БАГ?
еще раз специально для тормозов: для статических объектов, просто смотришься сегмент данных. если не умеешь в дизасме это, то просто стартуешь дебагер что бы в мэйне остановился, и смотришь сегмент данных.
для не-статики, нет никакой разницы по сравнению с обычным нормальным кодом.
ОК, допустим. Смотрю в сегмент данных. Вижу, что в сегменте данных какая-то хуйня, т.е. совсем не то, что мне нужно. Есть некая constexpr функция, которая вызывает другую constexpr функцию, которая в свою очередь вызывает третью, и там допустим есть всякие циклы в циклах, в общем есть некий нетривиальный constexpr код, который этот сегмент данных генерирует. Как мне его отдебажить? Как мне отследить выполнение (для тупых: сделать пошаговую отладку) этого constexpr говна
просто: убираешь constexpr и он магически-автоматически становится обычным кодом. та же семантика, тот же синтакс - только в одном слове различие.
попробуй подобное с макросами проэмулировать.
Т.е. мне надо глобальной автозаменой пройтись и убирать из всей цепочки этих constexpr функций ключевое слово constexpr? Ну просто заебись.
И да, тут возникает новый вид жопы: предположим что я пишу хуйню под какой-нибудь говноконтроллер, и constexpr-параша считает синусы-тангенсы и инициализирует ими массив, и все синусы в рантайм-код тупо не влазят(недостаточно места на флеше говноконтроллера под всю ту хуйню), т.е. мне нужно эту constexpr-парашу делать не-constexpr и компилировать ДРУГИМ КОМПИЛЯТОРОМ ПОД ДРУГУЮ БЛЯДЬ АРХИТЕКТУРУ чтобы тупо отладить, да? Если это не пиздец, то что?
> т.е. мне нужно эту constexpr-парашу делать не-constexpr и компилировать ДРУГИМ КОМПИЛЯТОРОМ ПОД ДРУГУЮ БЛЯДЬ АРХИТЕКТУРУ чтобы тупо отладить, да? Если это не пиздец, то что?
мля, как еслы бы нормальные юнит тесты когда либо в память говноконтроллера влазили. еще ни одного говноконтроллерного проекта не видел где бы 75% юнит тестов не на виндах делались. (потому что иначе и диагностики об ошибке иногда хер увидишь.)
по-моему, ты просто ни разу и не пробовал конст-экспры, почему и психуешь здесь. конст-экспры это безобидная и полезная *опциональная* фича. для начала, просто попробуй.
Я вообще плюсы достаточно мало пробую. Мои попытки их серьезно попробовать обычно заканичватся тем, что я потом долго матерюсь в адрес тех, кто придумал весь этот маразм.
Что касается constexpr-ов, то их использование весьма ограничено. Код с какими-нибудь malloc/free и memcpy в них не засунуть, так что для меня, как сишника, эта фича практически бесполезна. А выкручивать себе руки и писать в каком-то недофункциональном стиле у меня нет никакого желания
Расскажи подробнее про пару последних попыток. Что ты делал и что вызвало твои маты?
Например надо сделать JIT какой-нибудь примитивный, и я хочу в компилтайме вызывать ассемблер, чтоб он мне прямо в массив проинициализировал опкоды. вот типа:
и вот чтобы такую хуиту сделать, надо ассемблер переписывать нахуй весь на эти ебучие constexpr-ы, а я такой поебенью естественно заниматься не буду.
Или например хочу я сделать кучу функций по определенному правилу
Ясен хер, что подобная поебень в плюсах решается через т.н. шаблонное метапрограммирование. Ну ок, давайте напишем какую-то поебень на темплейтах
А теперь мне надо сделать ебучий массив из указателей на функции
http://ideone.com/OG2O1M
просто признай, что ты обычный неосилятор
Эмм, что это за говно вообще? Я вроде бы просил нормальный статический массив, тут же я вижу только какой-то std::array.
21 : <source>:21:11: error: no viable conversion from 'const std::array<double (*)(double), 256>' to 'double (**)(double)'
double (**a)(double) = power_funcs;
^ ~~~~~~~~~~~
1 error generated.
что это за хуйня? Почему не работает?
Во-первых, все языки (без исключения) говно. Во-вторых std::array это не статический массив в памяти, а какая-то блядь неведомая ебаная магия. А мне надо, чтоб все четко работало так, как я говорю
> Хочешь конвертнуть в указатель - std::array::data() в помощь
Попробовал - получилось какое-то откровенное говно
https://godbolt.org/g/GM6Nb3
Тебе не кажется, что это немного не то, что мне надо получить? Что это вообще говоря ГОВНО?
Ну давай возьмем код типа...
https://godbolt.org/g/y9zV4r
Вот смотри как заебись, тут честно дергатся инструкция mulsd, и я даже скобочки блядь расставил, чтобы оно заебись заоптимизировалось.
Сравни код функции pow_8 и pow_8_govno (кстати, компилятор GCC сделает эти функции аналогичными, если включить флаг -funsafe-math-optimizations)
кто тебе вообще сказал, что массив обязан быть статическим? Куда положил, там и лежит
> а какая-то блядь неведомая ебаная магия
N лежащих подряд элементов выбранного типа - неведомая магия?
> Что это вообще говоря ГОВНО?
Ты попросил pow_N, получил pow_N.
> да кстати, попробуй ... и чтоб скобочки оптимально расставлялись
Че пробовать-то, делать надо:
https://godbolt.org/g/iLpEuo
(на 256 No output: generated assembly was too large - 9 мб кода).
Лежащих где? Где-то "в астрале", да? Чтобы они реально где-то там начали лежать, надо использовать какую-то хуйню, типа std::array::data(). А как эта хуйня вообще устроена внутри? Если почитать исходники этого STL, там наверняка какой-то ебучий пиздец.
> Че пробовать-то, делать надо:
Не, так не пойдет. Попробуй обойтись без хуйни вида -funsafe-math-optimizations (представь что ты в говностудии компилируешь, где такой флаг отсутствует) но чтобы скобочки в умножении хуйни были таким образом расставлены, чтобы количество использованных mulsd инструкций для каждого случая было минимальным. Иными словами, в template нужно запрограммировать через какую-то жопу некую хуйню, которая бы находила наиболее оптимальный способ расставить скобочки в перемножении хуйни, чтобы количество умножений было наименьшим. Полагаться на какие-то нестандартные флаги компиляторов - говно.
лежащих там, где положил, неужели это не очевидно? Компилятор выкидывает неиспользуемые constexpr значения, поэтому нужно обращаться к ним чтобы компилятор их не выкинул. Например, так:
https://godbolt.org/g/NZdEkv
> Если почитать исходники этого STL, там наверняка какой-то ебучий пиздец.
ты у libfftw3/zlib и прочего тоже исходники читаешь вместо документации?
Ассемблерный выхлоп для pow_18_trivial имеет на одну инструкцию больше, и это при включенной опции -funsafe-math-optimizations
Если посмотреть ассемблерный выхлоп для этого же кода в Clang, то становится понятно, что Clang говно т.к. использует больше инструкций
1) во всех вариантах, показанных Antervis, ты ВСЁ ЕЩЁ можешь перегрузить конкретные реализации шаблона и написать там хоть черта лысого - ровно так же, как и в сишечке во всех твоих примерах
2) "хочу генерить это НАПИТОНе, у меня есть алгоритм как сделать минимальные разбиения" - ради бога, алгоритм наверняка целочисленный и самоочевидный, с несколькими ветвлениями - реализуй шаблонами вореции через static_if, направляй компилятор на разные пути шаблонных реализаций, внутри шаблонной реализации вызывай не N-1 калькуляцию (тривиал), а делай mymul<N/2>(a)*mymul<N/3>(a) и т.д.
3) экономить 1 сука инструкцию, которая выигрывается только в сравнении с конкретной версией компилятора в конкретную фазу луны и набор ключей - да это пиздец, онанизм в предельной степени, займись делом уже
Кстати, насколько эта инструкция критична по сравнению с вызовом функции по указателю?
НАХЕРА мне еботня с убогими кривыми шаблонами, если я могу использовать кодогенерацию, и не ебать себе мозг?
>2) "хочу генерить это НАПИТОНе, у меня есть алгоритм как сделать минимальные разбиения" - ради бога, алгоритм наверняка целочисленный и самоочевидный, с несколькими ветвлениями - реализуй шаблонами вореции через static_if,
НАХЕРА мне еботня с убогими кривыми шаблонами, если я могу использовать кодогенерацию, и не ебать себе мозг? Вся эта плюсовая шаблонная мета-ебля, чтоб сука оптимальнейшим образом скобочки расставить чтобы все неанскилльно считалось, она сука займет намного больше времени, чем если написать блядь кодогенератор для этой параши.
> 3) экономить 1 сука инструкцию, которая выигрывается только в сравнении с конкретной версией компилятора в конкретную фазу луны и набор ключей - да это пиздец, онанизм в предельной степени, займись делом уже
В других компиляторах (отличных сука от GCC) этот флаг или вообще недоступен, или нихера не оптимизирует так как надо. И там причин ебаться с расстановкой ебучих скобочек намного блядь больше https://godbolt.org/g/NqBAXk
Вот было б заебись, если бы можно было с AST нормально напрямую работать, а не через кривое шаблонное говно и прочую ебанутую хуйню
Вроде в расте можно писать плагины к компилятору и подсовывать их при сборке проекта вместе с сорцами, и это типа штатный способ писать продвинутую метушню у них. Хотя я точно не знаю.
п.с. Одна инструкция ему дохуя, а реализация pow на 9 мб - это нормально.
А теперь посмотри как твой же код выглядит в gcc 6.3 с теми же твоими флагами: https://godbolt.org/g/CY3anu
Ты готов при каждой мажорной (минорной?) смене компилятора перелопачивать проекты на миллионы строк кода, чтобы перепроверить, не добавилась ли вшивая инструкция в твой охуенно "оптимизированный" кококод?
Энивей, я вижу, что тебе нравится дрочить на работе. Так бывает, когда проекты не создают должный уровень челленджа, а времени (и гормонов) дохуя. Пройдет с возрастом. Ну или со сменой работы.
Нет конечно. Мне такой хуйней заниматься нахуй не надо. Я просто пытаюсь на конкретных примерах показать ограниченность плюсового так называемого метапрограммирования, которое по факту является убогим говном, т.к. нет гомоиконности
Вот тебе скрипт в помощь:
Алсо, x**0 = 1, если что.
Таким, что надо делать хуйню на питоне или другой хуйне, а встроенные средства плюсов - говно
Говноконтроллер можно отдебажить на реальном железе внутрисхемной отладкой. А ассерты оттранслировать в какие-нибудь брейкпоинты в особо интересных местах.
>еще ни одного говноконтроллерного проекта не видел где бы 75% юнит тестов не на виндах делались
Это реально только если только всю говнопериферию эмулировать, которая к контроллеру цепляется
И да, отдельная порция говна лично от меня. Для тех, кто свои компиляторы-говноSDK для контроллеров делает исключительно под винду
Зачем? Если на вход constexpr функции передать runtime-значения, она выполнится как обычная
И что самое замечательное, результат такого теста видно прямо в IDE. Даже компилить не надо.
> make && make install
Вменяемые люди голые мейкфайлы сейчас не пишут.
> установите 15 хуютилит
Питон есть везде, кроме разве что винды, которая нинужна.
Чем проще процесс сборки, тем реже приходится дергать девопса при внесении изменений. А система сборки может быть любой, лишь бы собирала просто
как ветеран кодогенерации, я думаю что фанатизм sos & j123 заключается в том что они только что для себя её (кодогенерацию) открыли. кодогенерация == хорошо. фанатизм == плохо.
т.к. они питон тут пихают, они может сконсом пользуются. тогда там да прямо в билд можно кодогенерацию в пихнуть, что есть очень удобно.
Но раз уж мы заговорили о моей личности, то нет, я не фанат кодогенерации (единственное что генерирует у меня код - это протобуф). Я фанатично ненавижу крестовую метушню и всех этих программистишек, которые пишут нечитаемые компилирующиеся по полчаса портянки на этой метушне. И нет, я не хейчу с++. Я профессиональный крестушок и дошел до жизни такой не от того, что больше ничего не умею.
> может сконсом пользуются
Питон можно вызвать из любой системы сборки. Конкретно я пользуюсь симейком.
лол, где?
опять ботоводы распоясались
Зачем сортировку-то писать? Достаточно при сборке проверять, что массив отсортирован, это делается относительно просто через constexpr функцию и static_assert. Пущай людишки руками сортируют (ну как руками — M-x sort-lines). Кмк, лучше видеть вещи в сорцах такими, какими они должны быть.
в общем случае да. и я не против так же в ран-тайме в инициализации сортировать, но народ на это жалуется, потому что все пытаются такого типа данные конст делать.
но с другой стороны, в таблицы языков/стран/локалей/кодировок/часовых поясов настолько редко надо смотреться, что народ реально забывает (или люди работы поменяли) как новый элемент добавлять. поэтому "проще - лучше" это тоже решение.
это даже случалось официальной таблицой часовых поясов. много лет ничего не менялось - автор сам забыл формат. сдвинули часовой пояс для острова на пол часа. но криво. и какой-то там мелкий остров в океании только через Н лет догадался что смена пояса совсем не прошла: потому что звонки и банковские платежи изредка на неправильный день бухались.
А в компайл-тайм варианте надо все эти посчитанные значения зашить в сегмент, который будет предоставлять глобальную таблицу.
Если они там под калькулятор пишут (для управления торсионными МБР, иначе зачем нужна таблица косинусов), то лишние 64МБ загружаемой прошивки - это болезненно. Да даже по интернетам распространять - 64МБ на дороге не валяются.
Я просто думал, что таблица статически выделена, но от переноса в constexpr она увеличивается в размерах в 64 раза.
Это еще почему? Зачем в хипе? Можно и в .bss
Да ну, всегда можно придумать какой-нибудь хитрожопый обходной маневр. Например, есть устройство с 128 мб ПЗУ. Под какую-то говнотаблицу синусов надо 64 мегов. Сама прошивка без таблицы синусов занимает скажем 32 мегабайта. Да тогда все просто. Делаем прошивку, которая без таблицы синусов но с хуитой чтобы считать синусы программно, через CORDIC или другое говно, типа всяких рядов Тейлора. Прошивка зашивается в целевое устройство, занимает она скажем 32 мегабайта + еще немного на эту функцию-считалку синуса. Сразу же после заливки прошивки, на самом прошитом устройстве запускается хуита, которая считает синус, и которая в ПЗУ память заносит это табличное говно с синусами, после чего эта функция для считания синуса больше никогда и не используется, а используется только та таблица, которая была проинициализирована в ПЗУ сразу после прошивки. Вот и все.
Парк - несколько тысяч девайсов. Так что на 64 мега нет, не похуй.
Потом девайсы, слава богу, отмодернизировали до прельстивого x86 с пердоликсом, кучей рам, диска и сетью (и стало возможно хуярить всё на бусте), но осадочек остался.
Я уже давно пролистываю эту поеботень (вореции) "как пропатчить МБР под 64кб на хуетино в компалтайме рантайма с констэкспрами"
Луи Седловой из отдела Абсолютного Знания изобрёл какую-то машину времени и сегодня будет докладывать об этом на семинаре.
В институте снова появился Выбегалло. Везде ходит и хвастается, что осенён титанической идеей. Речь многих обезьян, видите ли, напоминает человеческую, записанную, значить, на магнитофонную плёнку и пущенную задом наперёд с большой скоростью. Так он, эта, записал в сухумском заповеднике разговоры павианов и прослушал их, пустив задом наперёд на малой скорости. Получилось, как он заявляет, нечто феноменальное, но что именно – не говорит.
В вычислительном центре опять сгорел «Алдан», но Сашка Привалов не виноват, виноват Хунта, который последнее время из принципа интересуется только такими задачами, для которых доказано отсутствие решения.
Престарелый колдун Перун Маркович Неунывай-Дубино из отдела Воинствующего Атеизма взял отпуск для очередного перевоплощения.
В отделе Вечной Молодости после долгой и продолжительной болезни скончалась модель бессмертного человека.
Академия наук выделила институту энную сумму на благоустройство территории. На эту сумму Модест Матвеевич собирается обнести институт узорной чугунной решёткой с аллегорическими изображениями и с цветочными горшками на столбах, а на заднем дворе, между трансформаторной будкой и бензохранилищем, организовать фонтан с девятиметровой струёй. Спортбюро просило у него денег на теннисный корт – отказал, объявив, что фонтан необходим для научных размышлений, а теннис есть дрыгоножество и рукомашество…
Стругацкие. Понедельник начинается в субботу.