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

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

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

57 ответов

85 просмотров

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 - это вообще не функция, это ОПЕРАТОР ЯЗЫКА...

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

Andrey Electron
Почему ее воспринимают, как оператор, если это фун...

"все" это видимо все, кроме тех, кто так не делает

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" какбе прозрачно намекает, что на самом деле ваще не так, просто ведёт себя так

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Есть ли смысл устраиваться на 1с ? Даст это плюс в дальнейшем трудоустройстве на php? Просто у меня в городе вакансий на пхп нету. Или лучше удаленно искать. Опыта работы нету...
Azamat
14
Не ну фпц - это уже просто троллинг какой-то. Элементарный код нельзя собрать. ЧЯДНТ? program Project1; {$mode delphi} uses SysUtils, Classes, Generics.Collections; var...
Peter
4
а где есть mysql cloud кроме яндекс-клауд?
Oleg Nosov
13
hi im a cs student. i need some advice from people who have enough experience in Embedded Software. I need to know whether this profession is suitable for me. I have watched s...
Sahand 🏔️
8
А кто-нибудь запихивал сборку перловых модулей/образов с perl приложениями в окружения без интернета (в специализированном CI/CD)? У меня сейчас есть ряд cpanfile, которые н...
Andrey Smirnov / 𝓪𝓵𝓵𝓽𝓮𝓻 /
14
Карта сайта