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

标签 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 + 偏移量的指针读取 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/

相关文章:

c - 仅当我在我的 C 项目中使用代码时出现的 list.h 语法错误

在 C 中检查对 _Generic() 选择的支持

c++ - WOW64:从 32 位进程获取 x64 %CommonProgramFiles%

python - Pybind11 和 std::vector——如何使用胶囊释放数据?

c++ - 如何获取某个域用户的访问 token ?

gcc - ARM 汇编中的立即值是否需要哈希?

c++ - WriteProcessMemory 和类似函数是否会使可能缓存的数据无效?

c - 如何使用 float 来设置超时?

c++ - 是否可以在没有循环的情况下将数组元素与硬编码的初始值设定项列表进行比较?

c - 无法访问图书馆