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

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

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

57 ответов

158 просмотров

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта