【发布时间】:2016-01-18 10:35:46
【问题描述】:
问题
接受 C 样式数组作为参数、将其修改为 D 样式数组(包括更改长度)并将其返回为 C 样式数组的最佳方式是什么?
在上下文中
我正在用 D 编写一个库,它编译为带有 C 接口的 DLL(我将从 C++ 调用我的 D DLL,因此 C 接口是必要的)。
它需要byte 数组并修改其内容,有时会更改数组长度。
因为我使用的是 C 接口,所以我的函数必须接受 C 风格的数组。理想情况下,如果给定的缓冲区太小,我希望能够分配更多内存(即扩展bufferMaxSize)。
这就是我的 D DLL 现在接受参数的方式:
// D library code; compiles to DLL with C interface.
// bufferSize is the data length, and is a pointer because I may modify the data length.
// bufferMaxSize is the total allocated buffer size.
export extern(C) void patchData(const size_t bufferMaxSize, size_t * bufferSize, byte * buffer) { ... }
在我的 D 库中,我有接受 D 样式数组的现有代码。 在某个地方,必须将 C 样式数组转换为 D 样式数组。
我目前正在做这样的转换(简化示例):
// D library code; compiles to DLL with C interface.
export extern(C) void patchData(const size_t bufferMaxSize, size_t * bufferSize, byte * buffer) {
// Convert from C-style array to D-style.
byte[] dStyleArray = buffer[0 .. *bufferSize];
// Modify data.
dStyleArray[0] = cast(byte) 0xab;
dStyleArray[1] = cast(byte) 0xbc;
dStyleArray.length = dStyleArray.length + 16;
// Return modified data as C-style array.
buffer[0 .. dStyleArray.length] = dStyleArray[0 .. dStyleArray.length];
*bufferSize = dStyleArray.length;
}
它有效,但我不确定这里到底发生了什么。我主要关心的是速度。如果我循环这个函数,我不想不断地分配新的内存并来回复制它的内容。
当我执行byte[] dStyleArray = buffer[0 .. *bufferSize] 时,D 是在分配新的内存块并将所有内容复制到 D 样式数组中,还是指向已经分配的 C 样式数组?
当我执行dStyleArray.length = dStyleArray.length + 16 时发生了什么?由于dStyleArray 是从buffer 中分割出来的,我现在是在分配新内存/复制内存吗?还是我扩展到buffer?
当我buffer[0 .. dStyleArray.length] = dStyleArray[0 .. dStyleArray.length]; 时,我是复制内存,对吗?
是否可以仅将 D 样式数组“绑定”到 C 样式数组,并通过 D 样式数组的接口访问预分配的内存?
【问题讨论】:
标签: arrays memory-management d shared-memory slice