- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
接受 C 样式数组作为参数、将其修改为 D 样式数组(包括更改长度)并将其作为 C 样式数组返回的最佳方式是什么?
在上下文中
我正在写 D 中的库,可编译为具有 C 接口(interface)的 DLL (我将从 C++ 调用我的 D DLL,因此需要 C 接口(interface))。
需要byte
数组并修改其内容,有时会更改数组长度 .
因为我使用的是 C 接口(interface),所以我的函数必须接受 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 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];
,我是在复制内存,对吧?
最佳答案
When I do byte[] dStyleArray = buffer[0 .. *bufferSize], is D allocating a new chunk of memory and copying everything into the D-style array, or is it pointing to the already-allocated C-style array?
What's going on when I do dStyleArray.length = dStyleArray.length + 16? Since dStyleArray was sliced from buffer, am I allocating new memory/copying memory now? Or did I extend into buffer?
When I do buffer[0 .. dStyleArray.length] = dStyleArray[0 .. dStyleArray.length];, I am copying memory, right?
Is it possible to just "bind" a D-style array to a C-style array, and access pre-allocated memory through the D-style array's interface?
unittest
block 下面的函数,所以你可以通过给它一个指针来测试会发生什么。此外,如果您想确保没有进行任何 GC 分配,您可能需要考虑将
@nogc
在您的函数上进行静态检查(
nothrow
通常对于 C 函数也是一个好主意)。
关于arrays - 如何将 C 样式数组修改为 D 样式数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225282/
我是一名优秀的程序员,十分优秀!