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

Std::copy / memcpy

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

Студворк — интернет-сервис помощи студентам
Щас сойду с ума
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2019, 23:32
Ответы с готовыми решениями:

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

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

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

34
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
25.06.2019, 23:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rat0r Посмотреть сообщение
std::bit_cast
C++20, увы.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 23:26
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Сообщение от rat0r
std::bit_cast
C++20, увы.
C++
1
2
3
4
5
template<typename U, typename T>
constexpr auto convert(T val)
{
    return *(U *)&val;
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.06.2019, 23:29
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
return *(U *)&val;
Вот тут пишут что это может быть UB
https://en.cppreference.com/w/... e_aliasing
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 23:44
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вот тут пишут что это может быть UB
https://en.cppreference.com/w/... e_aliasing
Точно такое же UB, как memcpy
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
25.06.2019, 23:54
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Точно такое же UB, как memcpy
Цитата из ссылки:
When it is needed to interpret the bytes of an object as a value of a different type, std::memcpy or std::bit_cast (since C++20)can be used:
C++
1
2
3
4
5
6
double d = 0.1;
std::int64_t n;
static_assert(sizeof n == sizeof d);
// n = *reinterpret_cast<std::int64_t*>(&d); // Undefined behavior
std::memcpy(&n, &d, sizeof d); // OK
n = std::bit_cast<std::int64_t>(d); // also OK
1
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
01.07.2019, 20:41  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Точно такое же UB, как memcpy

Не по теме:

Зачем люди заходят в треды и не читая остальных постов отвечают ахинею?

0
01.07.2019, 20:44

Не по теме:

"ЧЯНДТ" расшифровывается как "Что я не делаю так?"

0
02.07.2019, 00:22

Не по теме:

Цитата Сообщение от h3mbr0 Посмотреть сообщение
Зачем люди заходят в треды и не читая остальных постов отвечают ахинею?
Вы, видимо, не согласны с тем, что копировать memcpy между разными типами это UB? И можете показать пункты в стандарте, которые определяют поведение?

0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.07.2019, 05:46
Цитата Сообщение от rat0r Посмотреть сообщение
Вы, видимо, не согласны с тем, что копировать memcpy между разными типами это UB?
ну, смотря какие типы.
§3.9.2
For any object (other than a base-class subobject) of trivially copyable type T, whether or not the objectholds a valid value of typeT, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.[42] If the content of the array of char or unsigned char is copied back into the object, the object shall subsequently hold its original value.
[Example:
C++
1
2
3
4
5
6
#define N sizeof(T)
char buf[N];
T obj; //objinitialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
//obj might be modified
std::memcpy(&obj, buf, N);// at this point, each subobject of obj of scalar type holds its original value
— end example]

42) By using, for example, the library functions (17.6.1.2)std::memcpy or std::memmove
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
02.07.2019, 06:02
GbaLog-, это тривиальный случай.
Я имею в виду что-нибудь вроде
C++
1
2
3
4
5
6
double d = 0.1;
std::int64_t n;
static_assert(sizeof n == sizeof d);
// n = *reinterpret_cast<std::int64_t*>(&d); // Undefined behavior
std::memcpy(&n, &d, sizeof d); // OK <- ??????
n = std::bit_cast<std::int64_t>(d); // also OK
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.07.2019, 06:04
del
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
03.07.2019, 20:27  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
Я имею в виду что-нибудь вроде
А в чем UB, можно поинтересоваться?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
03.07.2019, 20:31
Цитата Сообщение от h3mbr0 Посмотреть сообщение
А в чем UB, можно поинтересоваться?
В том, что в стандарте C++ нет адекватного описания того, что делает std::memcpy(&n, &d, sizeof d);.
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
03.07.2019, 20:53  [ТС]
Цитата Сообщение от rat0r Посмотреть сообщение
нет адекватного описания того
N4296 17.5.1.5
C library
Paragraphs labeled “See also:” contain cross-references to the relevant portions of this International Standard and the ISO C standard, which is incorporated into this International Standard by reference
N1548 9899:201x
7.23.2.1
Description
The memcpy function copies n characters from the object pointed to by s2 into the object pointed to bys1. If copying takes place between objects that overlap, the behavior is undefined.
Там же 6.5.7
An object shall have its stored value accessed only by an lvalue expression that has one ofthe following types:88)— a type compatible with the effective type of the object,— a qualified version of a type compatible with the effective type of the object,— a type that is the signed or unsigned type corresponding to the effective type of theobject,— a type that is the signed or unsigned type corresponding to a qualified version of theeffective type of the object,— an aggregate or union type that includes one of the aforementioned types among itsmembers (including, recursively, a member of a subaggregate or contained union), or— a character type.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.07.2019, 09:32
h3mbr0, подождём, что в C++20/23 примут насчёт memcpy.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2019, 09:32
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru