在 Ada 中创建 C 兼容的无限字符串的最快方法是什么?

What's the fastest way to create a C-compatible unbounded string in Ada?

我正在为 Windows 创建一个 Ada 程序,它需要能够将字符串传递给一些用 C 编写的函数。到目前为止,我一直在使用 Unbounded_String 在 Ada 中操作字符串类型,然后在将数据传递给 C 函数之前将数据转换为 Interfaces.C.char_array

这很好用,只是性能在速度较慢、较旧的计算机上有点问题。 C 函数有时会在略微修改的字符串版本上重复调用,并且每次都需要将 Unbounded_String 转换为类似的 char_array。字符串未被 C 函数修改,因此唯一必须转换为 char_array.

我想过将字符串存储在char_array 中,并在每次操作字符串时从Ada 类型转换。数据传递给 C 的次数比更改的次数多,因此可以提高性能。这种方法的问题是字符串的长度经常会改变,有时会改变很多,并且无法事先知道最大长度。

理想的解决方案是使用类似于 Unbounded_String 的方法,仅将字符串存储为 char_array。我的意思是动态大小的东西,当旧数组不够大时分配一个新数组,它应该允许 Ada Characters/Strings 插入(也删除)到数组中, 仅将那些字符转换为 C chars.

是否有任何(相对)简单、快速的方法可以做到这一点而无需自己实施?或者有没有其他在 Ada 中操作 C 兼容字符串的快速方法?提前感谢您的任何建议。

你没有提到你希望有多少个你的类型的对象,但我假设我们不是在谈论太多以至于你将用尽你的可用地址 space。

只需在私有记录中封装足够大的 char_array(比如最大预期大小的 10 倍),并创建所需的操作来操作它。

如果您很不走运,您可能需要告诉您的 compiler/run-time 环境您需要一个异常大的堆栈,但在您实际体验它时不要担心。