【发布时间】:2021-04-03 21:12:09
【问题描述】:
我有一个使用数据库的应用程序,该数据库以大端顺序存储数据。为了跨硬件平台可移植地访问这些数据,我使用了 config.h 模块中定义的 4 个宏:
word(p) - gets a big-endian 16 bit value at pointer p as a native 16-bit value.
putword(p, w) - stores a native 16-bit variable (w) to pointer p as 16-bit big-endian.
dword(p) and putdword(p, d) do the same for 32-bit values
这一切都很好,但在 little-endian 机器上的宏使用蛮力“移位和掩码”方法。
无论如何,Linux 上似乎有 builtin_bswap16 和 builtin_bswap32 函数可以更有效地执行此操作(作为内联汇编代码?)。那么,对我的 word/putword 宏进行编码以便它们在 X86_64 linux 机器上使用这些内置函数的正确方法是什么?将我的宏编码为 htons/l 函数调用是否可以有效地做同样的事情 - 是否有必要启用编译器优化才能使这些解决方案中的任何一个工作?如果它使 gdb 无用,我宁愿不优化。
【问题讨论】:
-
见endian(3) 和glibc endian.h 和newlib endian.h 和gspd/bits.h。
stores a native 16-bit variable (w) to pointer p as 16-bit big-endian.是否保证p对齐到 16 位?w是否保证对齐到 16 位? -
是的,16 位和 32 位对齐是有保证的。该数据库起源于 IBM Series/1,它是大端的,不支持未对齐的 16 位和 32 位数据提取/存储。事实上,数据库是系统的一部分,其中一些遗留的 Series/1 汇编代码仍然通过软件仿真层运行。与只需要字节交换数据库字段的新代码相比,该仿真层可能会从快速字节交换中获得更多好处......
标签: linux gcc endianness