Преобразование строки STL и вектора STL в void *?

StackOverflow https://stackoverflow.com/questions/1851355

  •  13-09-2019
  •  | 
  •  

Вопрос

У меня есть некоторый код на C ++, который мы используем для сериализации произвольных данных и сохранения их в специализированном формате изображения в качестве метаданных.

В любом случае, он воспринимает это как пустоту *.Могу ли я просто сделать простой memcpy?Или есть лучший способ сделать это?

Это было полезно?

Решение

Для std::string вы можете использовать c_str() для получения символа *, указывающего на внутреннюю строку.

Для std::vector стандарт предписывает, чтобы элементы были смежными в памяти, и поэтому вы можете получить доступ к указателю на начало данных как &v[0].

Вы, конечно, должны быть осторожны с ними, поскольку вы в основном передаете библиотеке, которую используете, указатель на внутренние данные объектов.При необходимости вы можете сделать копию данных с помощью memcpy, используя приведенное выше в качестве указателя src, но, очевидно, вам нужно позаботиться о том, чтобы использовать правильный размер.Не зная подробностей о функциях, которым вы передаете эти данные, мы не можем прокомментировать, нужно ли такое копирование или нет.

Другие советы

Строка STL может не сохранять данные в непрерывном блоке памяти .Используйте метод c_str(), чтобы получить из него строку в стиле c и сериализовать ее .Поскольку vector хранит свои данные непрерывно, вы можете напрямую сериализовать их.

Как указывали другие, &v[0] дает вам указатель на массив внутри вектора.

Однако имейте в виду, что сериализация данных с использованием memcpy, как правило, вообще не переносима в C ++.Данные должны иметь тип Plain-Old-Data (т.е.никаких нетривиальных конструкторов, виртуальных функций, определяемого пользователем деструктора или подобного), но даже тогда вам не следует ожидать получения правильного поведения, если вы не прочитаете его обратно в точно такую же программу.

Изменение целевой платформы, компилятора или даже настроек компилятора может изменить формат данных.Компилятору, например, разрешено и обычно он добавляет поля заполнения в структуры.

Существуют хорошие библиотеки, которые позволяют вам сериализовать сложные данные, такие как Ускорьте сериализацию, если вам нужно это сделать.Он уже имеет встроенную поддержку std::vector и других стандартных типов.

Вектор STL хранит свои элементы в непрерывной памяти, и поэтому вы можете использовать memcopy для копирования элементов, зная размер и номер элемента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top