在 C++ 中执行后存储数据和访问并从内存更新它
Store Data and Access and update it from Memory after execution in C++
我有一个关于如何在不使用 STL 的情况下在 C++ 中使用持久性的问题。我想在内存中存储一些计算历史,并在调用程序时用新计算更新它。我不能使用静态存储 class,因为执行后,内存丢失了。
任何指点都会有所帮助。流式传输是正确的方法吗?
最简单的事情是在磁盘上写入和读取结构。首先,定义要存储的内容:
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");
一些重要说明:
需要 std::ios::binary
来防止来自 "normalizing" 换行符的流(您正在存储二进制数据,而不是文本)。
需要 __packed__
来确保该结构在所有系统上具有相同的大小。同上 int32_t
而不仅仅是 int
.
- 此代码不处理 "endian" 问题,这意味着您需要在同一 "endianness" 机器上保存和恢复状态,因此您不能例如在 x86 上保存并在 SPARC 上加载.
- 该结构不得包含任何指针,这意味着它不能包含大多数 STL 容器、字符串或任何其他动态大小的元素。在 C++11 中,您可以在编译时使用
static_assert
确保这一点;在早期版本的 C++ 中,您可以根据需要使用 BOOST_STATIC_ASSERT
。
我有一个关于如何在不使用 STL 的情况下在 C++ 中使用持久性的问题。我想在内存中存储一些计算历史,并在调用程序时用新计算更新它。我不能使用静态存储 class,因为执行后,内存丢失了。
任何指点都会有所帮助。流式传输是正确的方法吗?
最简单的事情是在磁盘上写入和读取结构。首先,定义要存储的内容:
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");
一些重要说明:
-
需要
std::ios::binary
来防止来自 "normalizing" 换行符的流(您正在存储二进制数据,而不是文本)。
需要 __packed__
来确保该结构在所有系统上具有相同的大小。同上int32_t
而不仅仅是int
.- 此代码不处理 "endian" 问题,这意味着您需要在同一 "endianness" 机器上保存和恢复状态,因此您不能例如在 x86 上保存并在 SPARC 上加载.
- 该结构不得包含任何指针,这意味着它不能包含大多数 STL 容器、字符串或任何其他动态大小的元素。在 C++11 中,您可以在编译时使用
static_assert
确保这一点;在早期版本的 C++ 中,您可以根据需要使用BOOST_STATIC_ASSERT
。