170 похожих чатов

Парни, вопрос. В новом коде на cpp безо всякого легаси, что

лучше использовать, когда надо скопировать из одного байтового буфера в другой?
Варианты:
1. memcpy из string.h
2. std::memcpy из cstring
3. std::copy из algorithm
4. ???
?
Плюсы/минусы/подводные камни? Честно говоря, гугление выводило всё в холиварные темы на SO. Я вижу только логический подход. Поскольку string.h предоставляется со стандартной библиотекой только лишь для compatibility, я не вижу особого смысла использовать сишный memcpy в плюсовом коде, поскольку есть его стандартный плюсовый аналог без атрибута for compatibility reason.
Интересно узнать сторонние мнения.

57 ответов

152 просмотра

memcpy

std::copy

𝕴𝖛𝖆𝖓- Автор вопроса

Пофиг

𝕴𝖛𝖆𝖓
По причине?

Того что 2 первых варианта - Си с плюсами std::copy умеет в указатели и итераторы сразу

𝕴𝖛𝖆𝖓- Автор вопроса
Aliaksandr Onishchuk
Того что 2 первых варианта - Си с плюсами std::cop...

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

𝕴𝖛𝖆𝖓
По причине?

std::copy это шаблонная функция, и она не для байтов, а в целом для всего. memcpy тоже интересная функция, компилятор прекрасно знает что она делает, и у него, дня нее множество костылей.

std::copy подходит и туда и туда (компилируясь в memcpy при наличии возможности), а с memcpy надо каждый раз цепочку рассуждений на тему "у меня тут буфер тривиально копируемых типов или нет?"

Гражданин Котейко
std::copy подходит и туда и туда (компилируясь в m...

на тему компилируется в memcpy это тоже фантазии какие-то уже)

𝕴𝖛𝖆𝖓- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
итератор это указатель

🙄 Я копирую чар буфер из одного в другой, мне не нужны итераторы в этом контексте, я просто хочу чтобы это было эффективно. И я до сих пор не понимаю почему я должен выбрать memcpy или std::copy, а не std::memcpy.

Denis P
на тему компилируется в memcpy это тоже фантазии к...

Компилятор умеет упрощать std::copy в код эквивалентный memcpy

𝕴𝖛𝖆𝖓
🙄 Я копирую чар буфер из одного в другой, мне не н...

ну, берешь указатель на начало и на конец буфера, всё

Jokhar Ali
Компилятор умеет упрощать std::copy в код эквивале...

это ваши домыслы, никто такого не гарантирует

Гражданин Котейко
std::copy подходит и туда и туда (компилируясь в m...

Нет,лучше memcpy, как раз потому что он явно говорит, копируем байты

𝕴𝖛𝖆𝖓- Автор вопроса
𝕴𝖛𝖆𝖓
🙄 Я копирую чар буфер из одного в другой, мне не н...

не, среди мемсру и стд::мемсру лучше выбрать второе

Denis P
на тему компилируется в memcpy это тоже фантазии к...

да, действительно, ошибся, оно в memmove ещё может: https://gcc.godbolt.org/z/3o54foznc

𝕴𝖛𝖆𝖓- Автор вопроса
Ivan Sokolov
не, среди мемсру и стд::мемсру лучше выбрать второ...

Вот в такой ситуации у меня и вопрос, ПОЧЕМУ выбрать одного, а не другое. Единственная причина почему не использовать сишный memcpy это потому что он предоставлен for compatibility reason. Для меня том коде это вообще лишний атрибут.

𝕴𝖛𝖆𝖓- Автор вопроса
Гражданин Котейко
да, действительно, ошибся, оно в memmove ещё может...

О нет memmove точно не вариант, он же дополнительный буфер использует.

Denis P
это ваши домыслы, никто такого не гарантирует

никто не гарантирует что оптимизации компилятора вообще в принципе что-то ускорят, но тем не менее, когда хотят получить перформанс, начинают с того чтобы их включить, а не с того чтобы ходить по коду вставляя ассемблерные вставки и заменяя std::copy на memcpy/memmove

𝕴𝖛𝖆𝖓
Вот в такой ситуации у меня и вопрос, ПОЧЕМУ выбра...

::мемсру в общем случае не обязан существовать (хотя кого мы обманываем, будет) со стд::мемсру меньше неоднозначности при чтении кода

Гражданин Котейко
никто не гарантирует что оптимизации компилятора в...

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

𝕴𝖛𝖆𝖓- Автор вопроса
Гражданин Котейко
ЧЕГО?)

Ну memmove же копирует всё в intermediate буфер, а только потом в dst, дабы избежать проблему пересечения буферов, разве нет?

𝕴𝖛𝖆𝖓
Ну memmove же копирует всё в intermediate буфер, а...

Он избегает эту проблему по-другому, без промежуточных массивов

𝕴𝖛𝖆𝖓
Ну memmove же копирует всё в intermediate буфер, а...

нет, эту проблему можно решить проще через разворот порядка копирования при пересечении (на стандартном с или с++ такого не напишешь, но кого мы опять обманываем)

𝕴𝖛𝖆𝖓- Автор вопроса
Ivan Sokolov
нет, эту проблему можно решить проще через разворо...

Энивей это дополнительный код, который в моём случае лишний.

Стикер

𝕴𝖛𝖆𝖓- Автор вопроса

Только лишь по причине, что это без атрибута provided for compatibility reason?

𝕴𝖛𝖆𝖓
О нет memmove точно не вариант, он же дополнительн...

подскажите всё таки откуда это знание взято? меня с некоторых пор интересуют источники подобных знаний

𝕴𝖛𝖆𝖓- Автор вопроса
Ilya Zviagin
Нет, потому что это в неймспейсе std

Хорошо, чем тогда хуже std::copy_n?

Ничем если это тупые байты. просто memcpy может стать одной ассемблерной командой.

𝕴𝖛𝖆𝖓- Автор вопроса

Не перекрываются, есть гарантия в том контексте.

𝕴𝖛𝖆𝖓
Не перекрываются, есть гарантия в том контексте.

тогда memmove будет работать ровно так же как memcpy (лишь проверит сначала что нет перекрытия)

𝕴𝖛𝖆𝖓
Хорошо, чем тогда хуже std::copy_n?

memcpy - это вообще не функция, это ОПЕРАТОР ЯЗЫКА Си (ну, формально это функция, но её все воспринимают как просто оператор)

Ilya Zviagin
memcpy - это вообще не функция, это ОПЕРАТОР ЯЗЫКА...

Почему ее воспринимают, как оператор, если это функция. И кто эти "все" ? :)

Ilya Zviagin
Все нормальные програмисты на С/С++

В случае new/delete справедливое утверждение, но memcpy это, увы, всё таки функция

Ilya Zviagin
Все нормальные програмисты на С/С++

а тут можно наблюдать ещё один классический приём

Ilya Zviagin
Все нормальные програмисты на С/С++

Все нормальные програмисты на С/С++ говорят, что memcpy - это функия. Вы точно с нормальными общаетесь ? :)

Гражданин Котейко
подскажите всё таки откуда это знание взято? меня ...

и ведь никто не признаётся, не иначе агенты ЦРУ это всё распространяют

Так вот же... https://en.cppreference.com/w/cpp/string/byte/memmove Прям в синопсисе написано

Ilya Zviagin
Так вот же... https://en.cppreference.com/w/cpp/s...

"as if" какбе прозрачно намекает, что на самом деле ваще не так, просто ведёт себя так

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта