Asa*_*saf 1 c++ struct casting
我正在用C++编写一个记录器,我来到了我想要记录日志并写入文件的部分.
我已经创建了一个LogRecordstruct,并希望将其序列化并将其写入二进制模式的文件中.
我已经阅读了一些关于C++序列化的帖子,其中一个答案包括以下代码片段:
reinterpret_cast<char*>(&logRec)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过阅读reinterpret_cast和它做了什么,但我无法完全理解背景中真正发生的事情.
根据我的理解,它需要一个指向我的struct的指针,并将其转换为指向char的指针,因此它认为保存我的struct的内存块实际上是一个字符串,是真的吗?这怎么可行?
内存地址只是一个内存地址.内存本身并不特殊 - 它只是一个庞大的字节数组,对于我们所关心的所有内容.赋予记忆意义的是我们用它做什么,以及我们通过它观察它的镜头.
指向struct的指针只是一个整数,它指定了一些内存的偏移量 - 当然,你可以以任何你想要的方式处理一个整数,作为指向某个任意数量字节的指针char.
reinterpret_cast()除了允许您将内存地址的一个视图转换为内存地址的另一个视图之外,它不执行任何特殊操作.您仍然可以正确处理该内存地址.
例如,char*是在C++中引用字符串的传统方法 - 但字体的char*字面意思是"指向单个字符的指针".它是如何表示指向以null结尾的字符串的指针?按惯例,就是这样.我们根据具体情况对这种类型进行不同的处理,但我们要确保正确地执行此类操作.
例如,您如何知道通过char*指向结构的指针读取多少字节?类型本身为您提供零信息 - 由您自己知道您确实有一个指向固定长度结构的面向字节的指针.
请记住,在引擎盖下,机器没有类型.如果你在每一行写一篇文章,或者如果你乱涂乱画,那么一张纸并不在乎.这就是我们对待它的方式 - 以及我们使用的工具(C++)如何对待它.