首页 > 解决方案 > 将给定大小的 char 数组复制到 C 中的整数的正确方法是什么?

问题描述

假设我有一个 char 数组和一个相关的长度:ArrLen. 不是字符串,是字符数组。没有空终止符。但是我必须将数组数据复制到一个整数类型int64_t中。以下是它的完成方式,出于这个问题的目的,我假设Len不会超过 8:

int64_t Word = 0;
memcpy(&Word, Arr, Len);

这实际上是正确的方法吗?我正在复制内存,但有没有更快的方法可以内联,例如?那么Word可以register吗?

双关语类型的问题在于它假设Arr分配了 8 个字节。不,最多Arr分配了8 个字节。它可能有 5 个,因此强制转换为然后取消引用它可能会尝试在最后访问三个非法字节,从而导致段错误。Arrint64_t *

是做我描述的memcpy()电话的正确方法,还是有更快或更好的方法?

标签: arraysc

解决方案


由于您最多Len指定is ,因此假设小端存储是合理的,即. (8)Arr[0]

如果Len固定在(8),编译器可以memcpy简单地通过从内存中加载值来替换。这也取决于平台是否可以进行未对齐的读取 - 如果编译器无法证明对齐 -bswap如果架构是大端序,则可能涉及类似于 x86-64 上的指令。

Lena是运行时值这一事实可能会产生对memcpy. 调用本身的开销并非微不足道。考虑到所有因素,最好使用字节算术以与字节序无关的方式处理这个问题。该代码假定为 8 位字节,这似乎与您的问题一致。

uint64_t Word = 0;

while (Len--)
    Word = (Word << 8) | Arr[Len];

在更奇特的平台上,您可以将表达式(CHAR_BIT > 8)的右侧替换为. 事实上,这在具有 8 位(规范)字节的平台上已被优化,因此您不妨添加它以保持完整性。或者只是记住这些问题。OR(Arr[Len] & 0xff)

例如,有些平台具有合法的 C 实现,其中char, short,int是 32 位值。这些在嵌入式世界中很常见。


推荐阅读