arrays - 将给定大小的字符数组复制到 C 中的整数的正确方法是什么?

标签 arrays c

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

int64_t Word = 0;
memcpy(&Word, Arr, Len);
这实际上是执行此操作的正确方法吗?我正在复制内存,但是有没有更快的内联方法?所以Word可以 register ?
类型双关语的问题在于它假设 Arr分配了 8 个字节。不,Arr已在 大多数分配了 8 个字节。它可能有 5,所以类型转换 Arrint64_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/

相关文章:

递归数组的 PHP 奇怪行为

c - 如何将 $CC 中的 "implicit declaration"警告变成错误?

CMake 在 Windows 10 和 NVidia SDK 中找不到 OpenCL_LIBRARY

c - stdin 上的 read() 返回 EOF 而不是等待输入

c - C 如何知道赋值后一个 char* 有多长?

arrays - 从数组生成网格

javascript - 从循环值创建一个数组

python - 在未排序的 numpy 数组中查找值列表的索引

java - 在多个二维数组中搜索相似条目的代码

c - 将单词读入结构数组的函数