Pointers 锈迹中的铸造指针是否与C+中的重新解释铸造指针具有相同的行为+;?

Pointers 锈迹中的铸造指针是否与C+中的重新解释铸造指针具有相同的行为+;?,pointers,struct,rust,unsafe,Pointers,Struct,Rust,Unsafe,我在代码中定义了此结构: #[repr(align(4))] struct MetaDataDefn { cncVersion: i32, toDriverBufferLength: i32, toClientsBufferLength: i32, counterMetadataBufferLength: i32, counterValuesBuferLength: i32, clientLivenessTimeout: i64, startTimestamp: i6

我在代码中定义了此结构:

#[repr(align(4))]
struct MetaDataDefn {
  cncVersion: i32,
  toDriverBufferLength: i32,
  toClientsBufferLength: i32,
  counterMetadataBufferLength: i32,
  counterValuesBuferLength: i32,
  clientLivenessTimeout: i64,
  startTimestamp: i64,
  pid: i64
}
我有一个函数,它接受指向内存块的原始指针,其中第一个字节对应于具有相同布局的结构。 我认为如果我把U8指针转换成一个结构指针,我会得到与在C++中做一个RealTytType的结果一样的结果。然而,我认为情况并非如此,我对这里发生的事情有点困惑。这是函数的主体(函数接收的指针是cncFilePtr):

如您所见,将前4个字节强制转换为i32,然后打印结果,与将整个内容强制转换为MetaDataDefn并访问第一个成员(类型为i32)不同(我的理解是,这两种方法应给出相同的结果)


我的问题是:为什么结果不一样?铸铁中的铸造指针与C++中的RealType抛出(C++背景)相同吗?

< P>通常,RIST不能保证结构在内存中的表示方式。它可以对字段进行重新排序,使其更加紧凑,理论上甚至可以根据应用程序实际访问字段的方式优化字段顺序

您可以通过添加
#[repr(C)]
属性来修正顺序,使其行为类似于C:

#[repr(C)]
#[repr(align(4))]
struct MetaDataDefn { ... }

这样,两个指针将给出相同的结果,因为这保证了
cncVersion
首先出现。

通常,Rust不保证结构在内存中的表示方式。它可以对字段进行重新排序,使其更加紧凑,理论上甚至可以根据应用程序实际访问字段的方式优化字段顺序

您可以通过添加
#[repr(C)]
属性来修正顺序,使其行为类似于C:

#[repr(C)]
#[repr(align(4))]
struct MetaDataDefn { ... }

这样,两个指针将给出相同的结果,因为这保证了
cncVersion
首先出现。

为什么要这样做?由于类似的原因,Rust强烈反对使用原始指针。如果不使用原始指针,您如何处理外部内存(例如,来自内存映射文件的内存)?与
静态强制转换
vs
重新解释强制转换
一样,您首先为什么要这样做?由于这样的原因,在Rust中强烈建议不要使用原始指针。如果不使用原始指针,如何处理外部内存(例如,来自内存映射文件的内存)?与
静态强制转换
vs
重新解释强制转换