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

时间:2015-01-18 21:59:13

标签: interface ada c-strings

我正在为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兼容字符串的方法?提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

你没有提到你希望你的类型有多少个对象,但我会假设我们并没有谈论这么多,以至于你将会耗尽可用的地址空间。

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

如果你非常不走运,你可能需要告诉你的编译器/运行时环境你需要一个非常大的堆栈,但是在实际体验它时要省心。