Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

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


Ну а в общем не совсем понятно, почему С++ код в Си стиле, должен давать менее оптимальный выхлоп? Ну и примеры совсем уж притянуты.


ЗЫ Ну и исправьте ошибку с инициализацией, понятно что код демонстрационный, но глаз режет.

Зачем вы сравнили два разных кода с отключенной оптимизацией? В Си версии эквивалентом (без оптимизации) будет что-то типа:


  for (int i = 0;  i < 5; i++) {
    int val = testArray[i];
    lowest = ((lowest < val) ? lowest : val);
  };

А разве это не NP полная задача с псевдополиномиальным временем решения?

Т.е. деревья разработчикам не нужны? Но все равно, я в общем то говорил о понимании, а не о нужности ненужности.

Да, есть такое, некоторые просто заучивают серии команд, ну или на крайний случай машинально запоминают куда, что и в какой последовательности нажать в GUI. А когда-то программисты смеялись над секретаршами )))


Но меня удивило именно про понимание графа. А извините меня, деревья это частный случай графа. Т.е. судя по написанному — программисты которые работают в Microsoft и пользуются Git с трудом понимают как работают деревья в том числе. Или я уже что-то проспал и деревья стали продвинутой структурой данных?

Для работы с git разработчику необходимо научиться работать с направленным ациклическим графом (DAG, Directed Acyclic Graph), что уже непросто

Серьезно? Понять ациклический граф сложно?


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

Хотя маны говорят что


One valid (and intended) use of strncpy() is to copy a C string to a fixed-length buffer while ensuring both that the buffer is not overflowed and that unused bytes in the target buffer are zeroed out (perhaps to prevent information leaks if the buffer is to be written to media or transmitted to another process via an interprocess communication technique).

Так что я скорее неправ.

Ну или


strncpy(dst, "some long test", 4);
char * strncpy ( char * destination, const char * source, size_t num );

Copies the first num characters of source to destination. (http://www.cplusplus.com/reference/cstring/strncpy/)

Вы неправильно используете. Не sizeof(dst), а strlen("test").

похоже C в ту же сторону идёт.

с означенных событий прошло более 15 лет, с разношерстностью все более-менее ок.

Да может он использовать весь набор. -mach=native и в перед.

Прямое, это и есть сишное ABI, — унифицированная конвенция вызова сишных функций в форточках на x64 системах.

Т.е. сишное это то, которое может использоваться в си? Сами по себе ни Си ни С++ не определяют никаких ABI. Ну и каким образом это соглашение о вызове ставит крест на вертикальной масштабируемости?


Оно не сможет эффективно использовать большую часть существующих SIMD инструкций и менять последовательности команд в различных оптимизационных целях

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


Оно не сможет эффективно использовать большую часть существующих SIMD инструкций и менять последовательности команд в различных оптимизационных целях…

Ну допустим пока не сможет, хотя верится слабо, зачем тогда нужен программист? )

То есть MS продвинули свои safe функции в ISO C, но парни из комитета взяли и сделали версии функций, не совместимые вообще ни с одной существующей реализацией!

Как это они умудрились продвинуть мимо комитета, или как комитет мог перепринять? Помоему microsoft сами себе придумали эти функции и пометили старые как depricated.

Например вот это нечто пожирающее стэк без острой необходимости.

И какое отношение это имеет к "сишичке"? Изначальное утверждение было о том, что сишные ABI консервативны устаревши и ставят крест на вертикальной масштабируемости, вот я и спрашиваю какие такие сишные ABI?


С официальным гайдом по оптимизации.

Не совсем понял, какой-то компилятор генерирует код под форточки, который противоречит этому ману? Или тут упор на то, что ручная оптимизация качественней чем автоматическая?


Кстати современные (условно, примерно лет 15 последних) оптимизирующие компиляторы делают порой чудные оптимизации до которых так просто и не додумаешся. Не говоря о том, что код на "сишичке" нужно грамотно расхинтовать для началу,

а также отсутствие вменяемой оптимизации в случае с Сишкой на форточках

Вменяемой оптимизации по сравнению с чем?


но по уровню оптимизации сишка уступает тому же rust'у.

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


По этому от фронтенда до фронтенда один и тот же биткод (они решили отличиться) будет оптимизирован по разному.

Да что уж там, один и тот же байткод будет отличатся от компилятора к компилятору ну и что?

У ABI cишки слишком много консервативных и устаревших ограничений для сохранения портабельности, которые нынче не то что не нужны, а просто ставят крест на вертикальном масштабировании большинства решений.

Можете привести пример какие такие сишные ABI?

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

Значит, эти буферы в общем случае должны быть глобальными и уникальными. И их нужно генерить неким автоматическим способом (препроцессором?).

Их можно хранить в стеке вызывающей функции + глобальный указатель на предыдущий буфер.

Наверное стоит добавить что в случае использования sjlj стоит следить за переменными (например маркировать их volatile) потому что longjmp восстанавливает контекст сохраненный в момент вызова setjmp, т.е


    void* data = allocate_some();
    if (!(exc = setjmp(buf))) {
       data = reallocate_some();
        do_work(-3.0f);
    } 
    else {
        // тут значение data МОЖЕТ быть равное значению сохраненному на момент первого вызовы setjmp
        fprintf(stderr, "%s was hadled in %s()\n", exception_name[exc], __func__);
    }  

а зачем Clion генерирует codeblocks project file ?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность