2015-12-15 52 views
-1

我有一个关于如何在不使用STL的情况下在C++中使用持久性的问题。我希望将一些计算历史存储在内存中,并在程序被调用时使用新计算对其进行更新。执行后不能使用静态存储类,内存会丢失。存储数据和访问并在C++中执行后从内存更新

任何指针都会有所帮助。流式传输是否正确?

+0

你将需要更具体。你有没有考虑写入一个文件? (另外,我删除了C标签,因为您的描述中提到了C++,它们是不同的语言) –

回答

1

最简单的事情就是在磁盘上写入和读取结构。首先,定义要存储什么:

struct SavedState { 
    int32_t a; 
    float b; 
    char c[100]; // n.b. you cannot use std::string here! 
} __attribute__((__packed__)); 

static_assert(std::is_trivially_copyable<SavedState>::value, 
       "SavedState must be trivially copyable"); 

然后,创建一些州和保存:

SavedState s = { 1, 2.3 }; 
snprintf(s.c, sizeof(s.c), "hello world!"); 
std::ofstream outfile("saved.state", std::ios::binary); 
outfile.write(reinterpret_cast<char*>(&s), sizeof(s)); 
if (!outfile) 
    std::runtime_error("failed to write"); 

然后,将其还原:

SavedState t; 
std::ifstream infile("saved.state", std::ios::binary); 
infile.read(reinterpret_cast<char*>(&t), sizeof(t)); 
if (!infile) 
    throw std::runtime_error("failed to read"); 

一些重要注意事项:

  1. std::ios::binary需要防止来自“否rmalizing“新行(你正在存储二进制数据,而不是文本)。需要
  2. __packed__确保结构在所有系统上具有相同的大小。同上int32_t而不只是int
  3. 此代码不处理“endian”问题,这意味着您需要在机器的相同“字节序”上保存和恢复状态,因此您不能保存在x86上并加载到SPARC上。
  4. 该结构不能包含任何指针,这意味着它不能包含大多数STL容器,字符串或任何其他动态大小的元素。在C++ 11中,你可以在编译时使用static_assert;在早期版本的C++中,如果需要,可以使用BOOST_STATIC_ASSERT
相关问题