Войти
ФлеймФорумПрограммирование

Общие вопросы по программированию (453 стр)

Страницы: 1452 453 454 455562 Следующая »
#6780
18:04, 13 авг 2022

Panzerschrek[CN]
> В Ü, кстати, у меня есть несколько библиотечных функций, которые реализованы
> компилятором.

Я говорю про то, что компилятор C++ видя выражение вида:

a = b;

может заменить его на следующее:

memcpy(&a, &b, sizeof(a));

Это не то же самое, что функция memcpy как бы inline и разворачивается компилятором во что-то особенное по месту применения, а наоборот - компилятор знает какие именно эффекты библиотечная функция имеет и вставляет её вызовы там где их изначально не было.
Это как раз "магия".

#6781
(Правка: 18:09) 18:09, 13 авг 2022

=A=L=X=
> Это как раз "магия".
Ничего особенно магического тут нету. Поведение функции memcpy чётко определено стандартом. И компилятор может не только memcpy вставлять.

#6782
18:21, 13 авг 2022

Panzerschrek[CN]
> Ничего особенно магического тут нету. Поведение функции memcpy чётко определено
> стандартом.

Это было бы "естественно" если memcpy реально была встроена в ядро языка (как intrinsic), но она таковой не является.
Её можно легко заменить на свою реализацию просто выключив включение стандартной библиотеки.
И да, компилятор вставляя CALL MEMCPY будет вызывать твою реализацию ничего не зная что именно она делает.
Это знание в него встроено довольно искусственно и именно это и есть тут "магия", а не intrisic как таковые.

#6783
18:30, 13 авг 2022

=A=L=X=
> Её можно легко заменить на свою реализацию
Но зачем?

=A=L=X=
> И да, компилятор вставляя CALL MEMCPY будет вызывать твою реализацию ничего не зная что именно она делает.
Компилятор знает что делает memcpy. Посему он может заменить иногда её вызовы последовательностями обычных инструкций, если от этого код станет быстрее.
Аналогичные оптимизации существуют и для других функций, вроде memcmp и strlen.

#6784
(Правка: 18:33) 18:30, 13 авг 2022

Panzerschrek[CN]
> Хитрые крестовопросы:
> https://habr.com/ru/… ticle/682184/
> Я, к своему стыду, только на 5 из 8 правильно ответил.
У меня 6 из 8. Думал вообще на 1 или 2 только отвечу...
Завалился std::cout, и на "в c++ что не запрещено явно, то...".

+ Текст дальше поможет с ответом на один из вопросов
#6785
18:36, 13 авг 2022

Panzerschrek[CN]
> Но зачем?

Не зачем, а почему: потому что в ядре языка Си не было таких вещей. В ядре языка C++ вещей появилось тоже минимум - new/delete. Не функции, но операторы.
А memcpy была всегда просто "какой то функций извне" и в ядре языка в отличие от паскалевского WriteLn её не было.
И вопрос даже не в том, что memcpy "попала внутрь языка", а в том, что она туда попала не попадая. :)

#6786
18:46, 13 авг 2022

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.

  Чётче некуда просто.

#6787
20:34, 13 авг 2022

Zefick
> Ну если ты даже на такое не отвечаешь, то действительно твой уровень где-то 1
> или 2 :)
Согласен, это был нереальный фейл. Но я просто лишний смысл тогда ответу додумал  все же :)

#6788
20:43, 13 авг 2022

=A=L=X=
a=b для структуры/класса, если не определен оператор = заменяется на копирование для каждого поля a, в итоге последовательность mov

#6789
21:28, 13 авг 2022

=A=L=X=
> a = b;
> может заменить его на следующее:
> memcpy(&a, &b, sizeof(a));
memcpy не знает тип данных, поэтому подбирает копирование по выравниванию указателя, а типизированное копирование уже знает про свое выравнивание и использует его.

#6790
21:54, 13 авг 2022

=A=L=X=
> потому что в ядре языка Си не было таких вещей
Просто по факту проще оказалось реализовать библиотечную функцию, чем оператор языка.

Zefick
> Чётче некуда просто.
Именно. Описание есть. Ну а UB на то и UB.

#6791
2:49, 14 авг 2022

Zefick
> > Завалился на "в c++ что не запрещено явно, то...".
>   Ну если ты даже на такое не отвечаешь, то действительно твой уровень где-то 1
> или 2 :)
Го найди в С++ не запрещённое, но приводящее к уб.

#6792
3:02, 14 авг 2022

samrrr
>
> Го найди в С++ не запрещённое, но приводящее к уб.
если бы было запрещено, то ошибка бы компиляции была бы. И Не путай РЕКОМЕНДОВАНО НЕ ИСПОЛЬЗОВАТЬ и ЗАПРЕЩЕНО НЕ ИСПОЛЬЗОВАТЬ

#6793
(Правка: 5:58) 5:56, 14 авг 2022

в том вопросе не шла речь про UB.

Zefick
> If the objects overlap, the behavior is undefined.
не знать про memmove, хотя чего удивляться.

#6794
7:40, 14 авг 2022

FlyOfFly
> ЗАПРЕЩЕНО НЕ ИСПОЛЬЗОВАТЬ

Страницы: 1452 453 454 455562 Следующая »
ФлеймФорумПрограммирование