Dart FFI中如何将Uint8List复制到Pointer<Uint8>?有类似memcpy的方法吗?
Dart FFI 字节数组拷贝到Native内存的高效实现
方案1:使用ffi包自带的memcpy(最推荐,性能等价于C标准库的memcpy)
从Dart 2.17版本开始,官方ffi包提供了原生memcpy的直接绑定,不需要自己实现拷贝逻辑,效率最高:
import 'dart:io'; import 'dart:ffi'; import 'package:ffi/ffi.dart'; // 原有逻辑 var list = await file.readAsBytes(); Pointer<Uint8> buf = malloc.allocate(list.length); // 单行完成拷贝,底层直接调用C标准库的memcpy实现 memcpy(buf, list, list.length);
方案2:通过asTypedList转Dart列表批量赋值
如果你的Dart版本较低,不支持内置memcpy,可以用asTypedList把Native指针转为Dart侧的Uint8List,再通过批量赋值方法拷贝,性能同样远高于逐元素循环:
var list = await file.readAsBytes(); Pointer<Uint8> buf = malloc.allocate(list.length); // 将Native指针映射为Dart可操作的字节列表,属于零拷贝映射,无额外内存开销 final bufList = buf.asTypedList(list.length); // 批量赋值,底层走优化过的内存拷贝逻辑,没有Dart层循环的额外开销 bufList.setRange(0, list.length, list);
注意事项
- 两种方案的性能都比手动for循环高1~2个数量级,文件越大性能优势越明显。手动for循环每次取值赋值都要走Dart和Native的边界调用,额外开销极大。
- Native内存不会被Dart GC回收,使用完成后必须调用
malloc.free(buf)主动释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

