arrays - 将给定大小的 char 数组复制到 C 中的整数的正确方法是什么?
问题描述
假设我有一个 char 数组和一个相关的长度: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
指定is ,因此假设小端存储是合理的,即. (8)
Arr[0]
如果Len
固定在(8)
,编译器可以memcpy
简单地通过从内存中加载值来替换。这也取决于平台是否可以进行未对齐的读取 - 如果编译器无法证明对齐 -bswap
如果架构是大端序,则可能涉及类似于 x86-64 上的指令。
Len
a是运行时值这一事实可能会产生对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 位值。这些在嵌入式世界中很常见。
推荐阅读
- python - 如何从任何角度检测字母“H”
- jquery - 如何使 select2-container top 0?
- java - 从jpa中的数据源中截断表多个数据源不起作用
- php - PHP分解字符串,但将引号中的单词视为单个单词
- java - 创建项目后创建专用库文件夹
- node.js - npm install zsh:找不到命令:npm
- ios - 禁用呈现的视图控制器的交互式解除
- laravel - 无效编码:Laravel 中用于条带的 ISO-8859-1 API
- javascript - JavaScript 使用 lodash 将对象数组转换为另一个对象
- azure - 在 azure 中使用 linux 的自定义扩展设置环境变量