gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:38:04 25 4
gpt4 key购买 nike

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

违规关键字是

UNALIGNED

pData 是LPCBYTE

代码示例如下:

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

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

我想我明白这段代码在逻辑上想做什么,它想从指向 pData + 偏移量的指针读取 1 个字节。

第二个是说从 pData + offset 指针读取 8 个字节。

令人困惑的部分是为什么第一个是未对齐的。我以为读取 1 个字节总是对齐的。

还是我以某种方式误读了代码?

执行此操作的跨平台方式如下:

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

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

最佳答案

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

When you declare a pointer with the __unaligned modifier, the compiler assumes that the pointer addresses data that is not aligned. Consequently, for an application that targets an Itanium Processor Family (IPF) computer, the compiler generates code that reads the unaligned data one byte at a time.

在您的情况下,它只是等同于 header 中的任何内容:

#define UNALIGNED

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

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

关于c++ - 将 UNALIGNED MSVC 特定代码转换为可移植 C++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com