Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/163: Рейтинг темы: голосов - 163, средняя оценка - 4.55
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
1

Std::copy / memcpy

24.06.2019, 23:32. Показов 33717. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Щас сойду с ума
C++
1
2
3
4
5
6
7
8
template<typename T, typename U>
constexpr auto convert(T val)
{
    auto *buf = reinterpret_cast<uint8_t*>(&val);
    std::remove_cv_t<U> ret;
    memcpy(&ret, buf, sizeof T);
    return ret;
}
работает идеально

C++
1
2
3
4
5
6
7
8
template<typename T, typename U>
constexpr auto convert(T val)
{
    auto *buf = reinterpret_cast<uint8_t*>(&val);
    std::remove_cv_t<U> ret;
    std::copy(buf, buf + sizeof T, &ret);
    return ret;
}
возвращает мусор и перетирает стек
ЧЯНДТ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2019, 23:32
Ответы с готовыми решениями:

Не получается использовать std::copy как memcpy?
Получил задание переписать свою код: Поля x, y указывают координаты, куда должен быть помещен...

Std::begin() ,std::end(),std::copy
...// int main() { std::vector&lt;double&gt; data;//Работает cout &lt;&lt; std::begin(data); ...

Стандартный поток и STL (std::copy to std::cout)
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;algorithm&gt; #include &lt;functional&gt; #include...

std::copy
typedef std::list&lt;size_t&gt; Path; Path::iterator _it; Path path; std::copy( _it, path.end(),...

34
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
24.06.2019, 23:40 2
Лучший ответ Сообщение было отмечено h3mbr0 как решение

Решение

C++
1
std::copy(buf, buf + sizeof T, reinterpret_cast<uint8_t*>(&ret));
И сайзоф от типа в скобках указывается https://en.cppreference.com/w/cpp/language/sizeof
1
h3mbr0
24.06.2019, 23:45  [ТС]
  #3

Не по теме:

врубился
ох уж этот понедельник

0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 23:49 4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
возвращает мусор и перетирает стек
ЧЯНДТ?
Потому что, это ни разу не одинаковый код.
std::copy делает ret = *buf, а memcpy тупо копирует байты

Надо std::copy(buf, buf + sizeof T, (uint8_t *)&ret);
Причём оба варианта плохие, лучше так не делать
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.06.2019, 23:54  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::copy делает ret = *buf
ничего подобного

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Причём оба варианта плохие, лучше так не делать
интересно, а какие хорошие?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
24.06.2019, 23:56 6
Цитата Сообщение от h3mbr0 Посмотреть сообщение
ничего подобного
Да ладно. А как по-твоему?
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:02  [ТС] 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А как по-твоему?
Может мы друг друга не понимаем? она делает ровно то, что написано в стандарте
я пропустил каст для destination и перетер 3 байта после фрейма, человек сверху это заметил, в чем проблема?

И как с ответом на мой вопрос?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 00:08 8
Цитата Сообщение от h3mbr0 Посмотреть сообщение
я пропустил каст для destination и перетер 3 байта после фрейма, человек сверху это заметил, в чем проблема?
Ну, да не посмотрел, написал то же самое, что у него. И? Чего "ничего подобного"?

Цитата Сообщение от h3mbr0 Посмотреть сообщение
И как с ответом на мой вопрос?
Лучше не копировать объекты побитово. Тем более разных типов
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:09  [ТС] 9
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Лучше не копировать объекты побитово. Тем более разных типов
Так а что делать то?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 00:18 10
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так а что делать то?
Ну, я вообще не понимаю, что и зачем ты здесь пытался сделать. Так что делай, что хочешь.
0
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
25.06.2019, 00:18 11
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так а что делать то?
Написать оператор каста? Ну там канеш все от того зависит что и во что тебе надо кастить
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:22  [ТС] 12
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, я вообще не понимаю, что и зачем ты здесь пытался сделать. Так что делай, что хочешь.
Так и думал, наверное ты осознал свою ошибку =)
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 00:23 13
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Так и думал, наверное ты осознал свою ошибку =)
Нет, не осознал. И в чём же моя ошибка?
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:32  [ТС] 14
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И в чём же моя ошибка?
https://cellperformance.beyond... asing.html
int-float не являются similar types, так что c++11/14 в этом плане ничего не меняют
остается или memcpy или std::copy, последний по замерам некоторых, обычно быстрее
0
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
25.06.2019, 00:38 15
Цитата Сообщение от h3mbr0 Посмотреть сообщение
int-float не являются similar types
зачем понадобилось байтово копировать инт во флоат? ссылку не читал много букав
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:42  [ТС] 16
Цитата Сообщение от elseecay Посмотреть сообщение
зачем понадобилось байтово копировать инт во флоат? ссылку не читал много букав

Не по теме:

Что-нибудь слышал про протоколы, сериализацию, буферы?

0
163 / 70 / 39
Регистрация: 28.05.2019
Сообщений: 241
25.06.2019, 00:46 17
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Что-нибудь слышал про протоколы, сериализацию, буферы
слышать то слышал, интересовал конкретный пример ну да ладно
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
25.06.2019, 00:49 18
h3mbr0, а почему сразу не закастить к типу U?
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 00:50  [ТС] 19
Цитата Сообщение от zayats80888 Посмотреть сообщение
а почему сразу не закастить к типу U?
вот поэтому
Цитата Сообщение от elseecay Посмотреть сообщение
ссылку не читал много букав
доброй ночи, спасибо за помощь с проблемой
0
rat0r
25.06.2019, 01:39     Std::copy / memcpy
  #20

Не по теме:

Цитата Сообщение от h3mbr0 Посмотреть сообщение
интересно, а какие хорошие?
std::bit_cast :D

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2019, 01:39

Ошибка в std::copy не ясна
здравствуйте, есть следующий код, в котором возникает ошибка во время выполнения: std::string...

Memcpy, buffer overflow. Может ли возникнуть ошибка в функции memcpy
Бывает ли на практике такое, что код #define size 1000; // some value int x, y; /* ... */...

Std::copy как скопировать часть строки массива byte?
Вот из этой строки: BYTE pbHash; Нужно скопировать содержимое с 0й по 15ю ячейку, в эту строку:...

Error C2039: copy: не является членом "std"
Добрый вечер. Появились две ошибки: error C2039: copy: не является членом &quot;std&quot; error C3861:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru