将UNALIGNED MSVC特定代码转换为可移植C ++代码?

时间:2016-03-24 07:21:02

标签: c++ c gcc visual-c++ clang

我试图转换为MSVC编写的一些C ++代码,以便它可以在GCC或Clang上运行。

违规关键字是

  

UNALIGNED

pData LPCBYTE

代码的一个例子是:

 INT8 some8Value =  *(UNALIGNED INT8 *)&(pData[offset]);

INT64 some64Value = *(UNALIGNED INT64 *)&(pData[offset]);

我想我理解这段代码想要做什么,它想要从指向pData + offset的指针读取1个字节。

第二个是从pData +偏移指针读取8个字节。

令人困惑的部分是为什么第一个UNALIGNED。我认为读取1个字节始终是对齐的。

或者我是否以某种方式误读了代码?

跨平台的方式如下:

INT8 part1 = pData[offset];
INT8 part2 = pData[offset + 1];
...

然后在INT64情况下组合8个部分(例如)?

1 个答案:

答案 0 :(得分:2)

这是一个宏,在为Itanium处理器编译时等同于__unaligned,对于所有其他CPU都没有。 来自MSDN(@ https://msdn.microsoft.com/en-us/library/ms177389.aspx):

  

使用__unaligned修饰符声明指针时,编译器   假设指针指向未对齐的数据。   因此,对于面向Itanium处理器的应用程序   家庭(IPF)计算机,编译器生成读取的代码   未对齐的数据一次一个字节。

在你的情况下,简单地将它等同于标题中的任何内容:

#define UNALIGNED

或者,如果您愿意,可以从代码中的每个位置删除它。

编辑:在ARM处理器上,可以使用限定符__packed来指定未对齐的数据,GCC的存在为__attribute__ ((__packed__)),但MSVC不存在。对于后者,唯一的选择是#pragma pack(1),但效果应限于结构 有关SO答案Visual C++ equivalent of GCC's __attribute__ ((__packed__))的更多信息。