假设我有一个字符数组和一个关联的长度:Arr
和 Len
.不是字符串,是字符数组。没有空终止符。但是我必须将数组数据复制到类型为 int64_t
的整数中.这是它的完成方式,出于这个问题的目的,我假设 Len
不会超过8:
int64_t Word = 0;
memcpy(&Word, Arr, Len);
这实际上是执行此操作的正确方法吗?我正在复制内存,但是有没有更快的内联方法?所以Word
可以 register
?类型双关语的问题在于它假设
Arr
分配了 8 个字节。不,Arr
已在 大多数分配了 8 个字节。它可能有 5,所以类型转换 Arr
到 int64_t *
然后取消引用它可能会尝试访问最后的三个非法字节,从而导致段错误。做我描述的事情的正确方法是
memcpy()
打电话,或者有更快更好的方法吗?
最佳答案
由于您指定 Len
最多是 (8)
,假设小端存储是合理的,即在 Arr[0]
处的最低有效字节.
如 Len
已固定在 (8)
,编译器也许可以替换 memcpy
只需从内存中加载值。这也取决于平台是否可以进行未对齐的读取——如果编译器无法证明对齐——并且可能涉及类似 bswap
的内容。如果架构是大端的,则在 x86-64 上的指令。
事实是Len
是一个运行时值可能会产生对 memcpy
的调用.调用本身的开销并不小。考虑到所有因素,最好使用字节算术以独立于字节序的方式处理这个问题。该代码假定为 8 位字节,这似乎与您的问题一致。
uint64_t Word = 0;
while (Len--)
Word = (Word << 8) | Arr[Len];
在更多异国情调的平台上,其中 (CHAR_BIT > 8)
,您可以替换右侧的 OR
用 (Arr[Len] & 0xff)
表达.事实上,这是在具有 8 位(规范)字节的平台上优化的,因此您不妨添加它以保持完整性。或者只是记住这些问题。有些平台具有合法的 C 实现,其中
char
, short
, int
例如,是 32 位值。这些在嵌入式世界中很常见。
关于arrays - 将给定大小的字符数组复制到 C 中的整数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63006673/