Panzerschrek[CN]
> В Ü, кстати, у меня есть несколько библиотечных функций, которые реализованы
> компилятором.
Я говорю про то, что компилятор C++ видя выражение вида:
a = b;
может заменить его на следующее:
memcpy(&a, &b, sizeof(a));
Это не то же самое, что функция memcpy как бы inline и разворачивается компилятором во что-то особенное по месту применения, а наоборот - компилятор знает какие именно эффекты библиотечная функция имеет и вставляет её вызовы там где их изначально не было.
Это как раз "магия".
=A=L=X=
> Это как раз "магия".
Ничего особенно магического тут нету. Поведение функции memcpy чётко определено стандартом. И компилятор может не только memcpy вставлять.
Panzerschrek[CN]
> Ничего особенно магического тут нету. Поведение функции memcpy чётко определено
> стандартом.
Это было бы "естественно" если memcpy реально была встроена в ядро языка (как intrinsic), но она таковой не является.
Её можно легко заменить на свою реализацию просто выключив включение стандартной библиотеки.
И да, компилятор вставляя CALL MEMCPY будет вызывать твою реализацию ничего не зная что именно она делает.
Это знание в него встроено довольно искусственно и именно это и есть тут "магия", а не intrisic как таковые.
=A=L=X=
> Её можно легко заменить на свою реализацию
Но зачем?
=A=L=X=
> И да, компилятор вставляя CALL MEMCPY будет вызывать твою реализацию ничего не зная что именно она делает.
Компилятор знает что делает memcpy. Посему он может заменить иногда её вызовы последовательностями обычных инструкций, если от этого код станет быстрее.
Аналогичные оптимизации существуют и для других функций, вроде memcmp и strlen.
Panzerschrek[CN]
> Хитрые крестовопросы:
> https://habr.com/ru/… ticle/682184/
> Я, к своему стыду, только на 5 из 8 правильно ответил.
У меня 6 из 8. Думал вообще на 1 или 2 только отвечу...
Завалился std::cout, и на "в c++ что не запрещено явно, то...".
Panzerschrek[CN]
> Но зачем?
Не зачем, а почему: потому что в ядре языка Си не было таких вещей. В ядре языка C++ вещей появилось тоже минимум - new/delete. Не функции, но операторы.
А memcpy была всегда просто "какой то функций извне" и в ядре языка в отличие от паскалевского WriteLn её не было.
И вопрос даже не в том, что memcpy "попала внутрь языка", а в том, что она туда попала не попадая. :)
Vlad2001_MFS
> Завалился на "в c++ что не запрещено явно, то...".
Ну если ты даже на такое не отвечаешь, то действительно твой уровень где-то 1 или 2 :)
Panzerschrek[CN]
> Поведение функции memcpy чётко определено стандартом.
If the objects overlap, the behavior is undefined.
If either dest or src is an invalid or null pointer, the behavior is undefined, even if count is zero.
If the objects are potentially-overlapping or not TriviallyCopyable, the behavior of memcpy is not specified and may be undefined.
Чётче некуда просто.
Zefick
> Ну если ты даже на такое не отвечаешь, то действительно твой уровень где-то 1
> или 2 :)
Согласен, это был нереальный фейл. Но я просто лишний смысл тогда ответу додумал все же :)
=A=L=X=
a=b для структуры/класса, если не определен оператор = заменяется на копирование для каждого поля a, в итоге последовательность mov
=A=L=X=
> a = b;
> может заменить его на следующее:
> memcpy(&a, &b, sizeof(a));
memcpy не знает тип данных, поэтому подбирает копирование по выравниванию указателя, а типизированное копирование уже знает про свое выравнивание и использует его.
=A=L=X=
> потому что в ядре языка Си не было таких вещей
Просто по факту проще оказалось реализовать библиотечную функцию, чем оператор языка.
Zefick
> Чётче некуда просто.
Именно. Описание есть. Ну а UB на то и UB.
Zefick
> > Завалился на "в c++ что не запрещено явно, то...".
> Ну если ты даже на такое не отвечаешь, то действительно твой уровень где-то 1
> или 2 :)
Го найди в С++ не запрещённое, но приводящее к уб.
samrrr
>
> Го найди в С++ не запрещённое, но приводящее к уб.
если бы было запрещено, то ошибка бы компиляции была бы. И Не путай РЕКОМЕНДОВАНО НЕ ИСПОЛЬЗОВАТЬ и ЗАПРЕЩЕНО НЕ ИСПОЛЬЗОВАТЬ
в том вопросе не шла речь про UB.
Zefick
> If the objects overlap, the behavior is undefined.
не знать про memmove, хотя чего удивляться.
FlyOfFly
> ЗАПРЕЩЕНО НЕ ИСПОЛЬЗОВАТЬ