gpt4 book ai didi

c - 如何从基于 C 的扩展中安全地使用指向 Ruby 对象的指针?

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:13 25 4
gpt4 key购买 nike

我正在考虑编写一个基于 C 的 Ruby gem 来加速 Prawn 中的文本换行.我以前读过一小部分 MRI 的 C 源代码,但还不太了解用于构建扩展的 API。

在我的 C 代码中,我想获得一个指向 Ruby 字符串中数据的直接指针,然后逐字节遍历它。此外,我想在我自己的 struct 中存储指针 within 缓冲区,并且不仅在单个调用的范围内使用它们,而且在 随后调用扩展代码。

这可能吗? GC 能否移动 字符串,使我的指针无效?而且,我怎样才能让 Ruby 知道我在我自己的 struct 中持有指向字符串的指针(这样 GC 就不会尝试回收它们)?能否以与 MRI 1.8 和 1.9 兼容的方式编写此代码?

因为我在询问在基于 C 的 Ruby 扩展中安全地使用指针:我可以像在“常规”中那样使用 mallocfree "基于 C 的项目?

最佳答案

matt 提供的链接非常好。如果我之前找到它,我会节省几天的时间。

您可以保留对 ruby​​ 字符串的引用和指向它们的指针。我建议卡住字符串。然后每次更改字符串的尝试都会失败。有一个函数 Data_Wrap_Struct() 可以让您将自己的数据结构包装到 Ruby 对象中。除了数据结构和结构的类之外,该函数还有两个函数参数。其中之一(标记)用于向垃圾收集器显示您的结构在何处引用其他 ruby​​ 对象。

我花了一些时间才明白,垃圾收集器实际上是在扫描所有 ruby​​ 线程的堆栈以寻找对 ruby​​ 对象的引用。因此,将 VALUE 保存在堆栈中也是一种保持对象被引用的安全方法。

Can this code be written in a way which is compatible with both MRI 1.8 and 1.9?

从 1.8 到 1.9,用于扩展的基本 API 并没有太大变化(我认为)。但到目前为止我只使用了 1.9。

can I use malloc and free the same as I would in a "regular" C-based project?

当然,我想不出有什么理由不能做到这一点,只要您不希望垃圾收集器负责处理分配的内存即可。

我遇到了困难,混合 C++ 代码,用另一个版本的 gcc 编译,而不是用 ruby​​ 解释器编译的版本。如果您遇到奇怪的启动行为,我会检查编译器版本差异。

关于c - 如何从基于 C 的扩展中安全地使用指向 Ruby 对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058771/

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