You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:36:03