【发布时间】:2016-06-10 15:00:07
【问题描述】:
我正在用 C++ 编写一个记录器,我已经到了我想要获取日志记录并写入文件的部分。
我创建了一个LogRecord 结构,并希望将其序列化并以二进制模式将其写入文件。
我已经阅读了一些关于 C++ 序列化的帖子,其中一个答案包括以下 sn-p:
reinterpret_cast<char*>(&logRec)
我已尝试阅读有关 reinterpret_cast 及其作用的信息,但我无法完全理解后台实际发生的情况。
据我了解,它需要一个指向我的结构的指针,并将其转换为指向一个字符的指针,所以它认为保存我的结构的内存块实际上是一个字符串,这是真的吗?怎么会这样?
【问题讨论】:
-
"与 static_cast 不同,但与 const_cast 类似,reinterpret_cast 表达式不会编译为任何 CPU 指令。它纯粹是一个编译器指令,指示编译器将表达式的位序列(对象表示)视为如果它的类型为 new_type。”来源:en.cppreference.com/w/cpp/language/reinterpret_cast 接下来发生的事情取决于您的代码 - 在审查代码时将
reinterpret_cast视为一个重要的警告标志。 -
不是“实际上是一个字符串”而是“实际上是一个指向
char的指针”。字符串只是char*的用途之一。 -
reinterpret_cast的可能重复
-
出于可维护性的目的,最好隐藏这些低级实现细节。您还必须非常小心对齐以及将来您可能希望向该结构添加字段的可能性。在某些情况下,基于文本的序列化可能更可取...
-
用二进制写入整个结构记录不一定可移植,即使在同一编译器的不同版本之间,甚至在使用不同编译标志的相同编译器版本的不同编译之间也不一定可移植。对于有一定持续时间的日志文件,我建议单独编写每个字段。此外,如果您想要平台兼容性,您可能希望以网络字节顺序输出数字字段。