【far 语言】原生内存与 FFI

本文是「far 语言」系列文档之一,总目录见《【far 语言】语言文档目录》。

原生内存:bytes + load/store

bytes 是 far 表达"连续原生内存"的唯一方式(独立堆外分配,地址稳定)。类型化读写走编译期 bytesLoad<T> / bytesStore<T>

分配与基础操作

buf := bytes(64);            // 分配 64 字节连续内存,零初始化
println(bytesLen(buf));         // 64

bytesSet(buf, 0, 0x41);         // 写单字节('A')
b := bytesGet(buf, 0);       // 65

s := bytesToStr(buf);        // 转字符串(到首个 \0)
bin := bytesFromStr("AB");   // 字符串 → 字节缓冲
p := bytesPtr(buf);          // 稳定数据指针(传给 C 用)

类型化读写:load / store

// 语法:bytesLoad<T>(bytes, 偏移) / bytesStore<T>(bytes, 偏移, 值)
bytesStore<i32>(buf, 0, 42);
x := bytesLoad<i32>(buf, 0);      // 42

bytesStore<u16>(buf, 4, 300);
y := bytesLoad<u16>(buf, 4);      // 300

// 符号 / 零扩展
bytesStore<i8>(buf, 8, -1);
neg := bytesLoad<i8>(buf, 8);     // -1
u := bytesLoad<u8>(buf, 8);       // 255

// 64 位 / double
bytesStore<long>(buf, 16, 5000000000);
l := bytesLoad<long>(buf, 16);    // 5000000000

bytesStore<double>(buf, 24, 3.14);
d := bytesLoad<double>(buf, 24);  // 3.14

// 指针
bytesStore<ptr>(buf, 32, address);
p2 := bytesLoad<ptr>(buf, 32);
  • 类型实参:i8/u8/i16/u16/i32/u32/i64/u64/bool/ptr/usize、far 业务类型 byte/short/int/longdouble
  • 布局 / 宽度 / 对齐编译期算好,运行时零布局信息。
  • 有符号类型 load 符号扩展,无符号零扩展。

GC 与大块内存

  • 数据区堆外分配(u.bytes.data 独立 malloc),GC 只扫 40B 对象头,成本 O(1)。
  • GC 不移动对象,地址稳定,无大块拷贝停顿。
  • bytes 活 → 数据活;bytes 回收 → 数据释放,无泄漏。
posted @ 2026-09-13 05:05  方东信  阅读(4)  评论(0)    收藏  举报