【发布时间】:2017-05-05 13:01:24
【问题描述】:
我知道如何反转字节顺序 (convert big endian to little endian in C [without using provided func]) - 在这种情况下,我想使用 __builtin_bswap64
我也知道如何将 64 位 uint 复制到 char 数组 - 最好是 memcopy。 (How do I convert a 64bit integer to a char array and back?)
我的问题是这两者的结合。在问题的根源上,我正在尝试找到此代码的更快替代方案:
carr[33] = ((some64bitvalue >> 56) & 0xFF) ;
carr[34] = ((some64bitvalue >> 48) & 0xFF) ;
carr[35] = ((some64bitvalue >> 40) & 0xFF) ;
carr[36] = ((some64bitvalue >> 32) & 0xFF) ;
carr[37] = ((some64bitvalue >> 24) & 0xFF) ;
carr[38] = ((some64bitvalue >> 16) & 0xFF) ;
carr[39] = ((some64bitvalue >> 8) & 0xFF) ;
carr[40] = (some64bitvalue & 0XFF);
由于 memcopy 不将 __builtin_bswap64 的结果作为源参数(或者是吗?),我尝试了这个:
*(uint64_t *)upub+33 = __builtin_bswap64(some64bitvalue);
但我最终得到了 错误:需要左值作为赋值的左操作数
有没有比我要替换的原始代码更快的替代方法?
【问题讨论】:
-
upub的类型是什么?您可能违反了严格的别名规则。 -
你为什么认为它太慢了?你看过汇编代码吗?你有简介吗?首先专注于编写可移植和可读的代码(例如,通过将其包装在一个函数中),仅在遇到速度问题时进行优化。
-
我确实有速度问题,我知道“过早的优化问题”。不适用于这里。我的假设完全基于直觉,但以
*((uint64_t *) upub + 33) = __builtin_bswap64(some64bitval);为基准,我的直觉被证明是正确的。