gpt4 book ai didi

arrays - 如何将 C 样式数组修改为 D 样式数组?

转载 作者:行者123 更新时间:2023-12-04 10:24:18 26 4
gpt4 key购买 nike

问题

接受 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 库中,我有接受 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 ?由于 dStyleArraybuffer 切出,我现在是在分配新内存/复制内存吗?或者我是否扩展到 buffer ?

当我做 buffer[0 .. dStyleArray.length] = dStyleArray[0 .. dStyleArray.length]; ,我是在复制内存,对吧?

是否可以将 D 样式数组“绑定(bind)”到 C 样式数组,并通过 D 样式数组的接口(interface)访问预分配的内存?

最佳答案

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?



是指点Phobos 使用相同的技巧将 C“字符串”转换为 D 字符串:
https://github.com/D-Programming-Language/phobos/blob/67c95e6de21d5d627e3c57128b4d6e332c82f785/std/string.d#L208-L211

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?



这可能不是你想要/期望的。它将在垃圾回收内存上分配一个新 block ,并将内容复制到其中。它无法扩展它,因为运行时没有关于内存块的任何信息(它不管理它)。您是否真的要扩展缓冲区,或移动指针(将在 D 中切片)?

When I do buffer[0 .. dStyleArray.length] = dStyleArray[0 .. dStyleArray.length];, I am copying memory, right?



是的。这被降低到一个memcpy。

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?



是的,这就是你一开始所做的;)

如果您只想更改数组的前 2 个元素,只需进行绑定(bind)并更改它们,它将“正常工作”。

如果你想测试行为,我建议你放一个 unittest block 下面的函数,所以你可以通过给它一个指针来测试会发生什么。此外,如果您想确保没有进行任何 GC 分配,您可能需要考虑将 @nogc在您的函数上进行静态检查( nothrow 通常对于 C 函数也是一个好主意)。

关于arrays - 如何将 C 样式数组修改为 D 样式数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com