2013-08-14 4 views
1

У меня очень сложная структура данных с указателями на различные части памяти. Это займет некоторое время, и я хотел бы сохранить «память», используемую этой структурой на диске. Затем, когда программа будет запущена снова, она просто сохранит карту, и я могу ее использовать. Есть какой-либо способ сделать это ?сохранение структуры данных C++ на диск

+0

Да, просто пройдите через вашу структуру и скопируйте массив байтов. Если это указатель, просто получите доступ к данным, на которые указывает указатель, и скопируйте их. Приведите пример структуры, и я пойду глубже. – Magn3s1um

+1

Можете ли вы показать свою структуру данных? – lurker

+0

Опубликуйте упрощенную версию класса, скажем, с двумя указателями на другие вещи и с несколькими простыми членами данных, и мы покажем вам, как писать и читать. – Beta

ответ

0

Это можно сделать, да, но вам нужно знать, как структура фактически хранится в памяти, и как это изменяется на разных платформах (выравнивание, упаковка, порядок байтов, размеры примитивного типа и т. Д.). , Кроме того, было бы разумно изменить ваши «указатели на разные части» на «смещения на разные части», поскольку фактические ячейки памяти будут меняться между процессами.

пример, пишущий объект, как это на диск должен быть достаточно портативный:

#pragma pack(1) 
typedef struct { 
    unsigned char data8[8]; 
    unsigned char data4[4]; 
    unsigned char offset[2]; 
    unsigned char data2[2]; 
} MyStruct; 
#pragma pack() // to return to default 

, но один, как это было бы весьма проблематично:

typedef struct _MyStruct { 
    unsigned long long data8; 
    unsigned int data4; 
    struct _MyStruct *nextOne; 
    unsigned short data2; 
} MyStruct; 
3

подталкивание :: сериализации может это сделать. Примечание: сначала напишите архивную версию, а затем register_types

+0

Я пробовал это, но он говорит, что мне нужен метод serialize(). Это верно ? – madreblu

+0

@madreblu yes - lookup boost docs –

+0

Но как бы я написал такой метод? Я видел примеры онлайн, но примеры с действительно тривиальными структурами не со сложной структурой указателя. – madreblu

0

Вы можете начать с Boost.Interprocess и использовать карты памяти. Ваша структура данных будет выглядеть litle differnt (указатели - это умные указатели, ссылки запрещены, нет виртуальных функций). Но это должно быть управляемо. По крайней мере, все типы, которые вы используете, должны быть созданы в общей памяти. Некоторые из них (Boost.Container), а некоторые нет (Boost.Any, Boost.Variant).

 Смежные вопросы

  • Нет связанных вопросов^_^