在Lua中高效地操作(C-风格)、C分配的动态数组进行读写。

假设我在 C/C++ 代码中分配了一个 C 风格的动态 double 数组,因此我有:

double *x; //指向分配的内存的开头
int size; //数组大小

是否可能编写 Lua 代码(甚至是在 Lua 中使用的 C/C++ 代码),使得嵌入式 C/C++ 的 Lua 实例能够高效地读/写这个数组的 "视图" 中的元素?

我只需要支持以下 C++ 操作:

double y = x[2]; //读取
x[2] = 3.0; //写入
int vecSize = x.size(); //数组的大小

不需要(也不想要)内存管理。

原文链接 https://stackoverflow.com/questions/4875019

点赞
stackoverflow用户107090
stackoverflow用户107090

Sure, export the pointer as userdata and set __index and __newindex metamethods.

当然,将指针导出作为 userdata 并设置 __index 和 __newindex 元方法。

2011-02-02 13:32:23
stackoverflow用户221509
stackoverflow用户221509

尝试使用 Mike Pall 最新的 LuaJIT 2.0,它具有新的 FFI 接口(仍在开发中)。

它使您能够使用自然的 Lua 语法直接操作 C 结构和数组。以下是 LuaJIT 文档中的示例:

local ffi = require("ffi")
ffi.cdef[[
typedef struct { uint8_t red, green, blue, alpha; } rgba_pixel;
]]

local function image_ramp_green(n)
  local img = ffi.new("rgba_pixel[?]", n)
  local f = 255/(n-1)
  for i=0,n-1 do
    img[i].green = i*f
    img[i].alpha = 255
  end
  return img
end

如果您无法使用 LuaJIT,则使用标准 Lua userdata,您可以分配所需的任何大小(size * sizeof(double)),并创建适当的 __index__newindex 元方法来使用 array[i] 访问元素。

以这种方式无法使用 lightuserdata,因为您无法设置它们的元表,但是您可以像这样使用它:value = get(array, i); set(array, i, value)

2011-02-02 15:09:01