Преобразование строки STL и вектора STL в void *?
Вопрос
У меня есть некоторый код на 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 для копирования элементов, зная размер и номер элемента.