什么时候需要在 Ruby C 扩展中声明易失性值?

2024-03-18

我找不到太多关于何时适合声明的文档VALUE as volatileRuby 扩展中以避免过早对正在使用的对象进行垃圾回收。

这是我到目前为止所学到的。有人可以填空吗?

When volatile does not需要使用:

  • 在 C++ 对象成员中 (因为它们从来不在堆栈上?)
  • 在不调用 Ruby API 的 C/C++ 方法中(因为在调用 Ruby API 之前 GC 不会打开)

When volatile does需要使用

  • 在调用任何 Ruby 的 C/C++ 方法中ALLOC or malloc宏/函数(因为当内存高度碎片化时这些会触发GC)
  • 在调用任何 Ruby 函数的 C/C++ 方法中(例如,rb_funcall, rb_ary_new, etc.)

其他避免GC的方法

  • mark VALUE正在使用的
  • 在对象创建期间禁用 GC,然后重新启用它
  • 不要使用 Ruby 的分配方法(有风险)

一切都正确吗?我缺少什么细节?除了标记之外,还有volatile唯一的办法?


我想说的经验法则是,如果您的变量值可以在运行时随时更改,并且您不知道何时更改,请使用volatile关键词。这包括中断。例如,您有中断回调函数,可以计算用户在键盘上按下某项的次数。您的程序不知道用户何时按下键盘上的按钮,因此您的计数器变量必须声明为volatile关键词。

如前所述,它禁用变量的某些编译器优化。例如:

int a = 5;
while(a == 5){
  //do something
}

编译器优化了while(a == 5)声明给while(true)因为它发现变量 a 在运行时不能更改,并且检查 a 的值是没有用的a每个循环。所以你最终陷入了无限循环。但如果你添加关键字volatile:

volatile int a = 5;
while(a == 5){
  //do something
}

您只需告诉编译器将变量保留原样即可。不要对其进行任何优化,某些中断可能会改变它的值。在这方面它工作得很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候需要在 Ruby C 扩展中声明易失性值? 的相关文章

  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何使用 Devel::Cover 和证明?

    我看到这里和上有一些类似的问题http www perlmonks org http www perlmonks org但我还是不明白 想象一下我有一个带有 lib 和 t 目录的项目 我用 证明 运行我的测试 cd PROJECT ROO
  • C# - 如何为多级继承层次结构指定泛型类型约束?

    我有以下类层次结构 public class EntityBase
  • Jquery获取表单字段值

    我正在使用 jquery 模板在同一页面上动态生成多个元素 每个元素看起来像这样 div div class something Hello world div div class formdiv div div
  • JScrollPane 无法在空布局中工作

    import javax swing JCheckBox import javax swing JFrame import javax swing JLabel import javax swing JPanel import javax
  • .jcall(cell, "V", "setCellValue", value) 中的错误:尝试 write.xlsx 时未找到带有签名 ([D)V 的 setCellValue 方法

    library dtplyr library xlsx library lubridate data frame 612 obs of 7 variables Company Factor w 10 levels Harbor HCG 6
  • JQuery:委托和日期选择器

    我需要给定类中的每个文本输入都是一个日期选择器 就像是 input type text time datepicker 但我通过 Jquery load 添加了很多代码 所以我相信我需要一个委托 问题是我不知道该怎么做 因为据我所知 加载事
  • Ninject 3.0 MVC kernel.bind 错误自动注册

    kernel Bind 上的获取和错误scanner gt 在 VS 2010 中 scanner 下面有一条小错误线 无法将 lambda 表达式转换为类型 System Type 因为它不是代表 类型 尝试像 2 0 中的旧 kerne
  • Xcode 7:将数组控制器绑定到单选按钮组

    我有一小组对象 用户应该能够使用单选按钮组从中选择一个对象 这些对象已绑定到数组控制器 有没有办法将该阵列控制器绑定到单选按钮组 以便动态生成其他单选按钮 如果可能 首选 IB 解决方案 示例项目 https scriptreactor c
  • 无法为 Kindle Fire HD 安装 ADB

    我正在尝试root它 尽管在我安装了正确的ADB驱动程序之后 当我插入我的Kindle fire HD 7 时 点燃火 gt Android 复合 ADB 接口 没有出现在设备管理器中 因此我无法执行root 我已将 0x1949 添加到
  • Elasticsearch 使用 jest 通过查询删除[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我发现一个有趣的功能叫做通过查询删除 https www elastic co guide en el
  • 如何使用 python 从文本文件的行中读取特定字符?

    我有多个 txt 文件 其中包含与此类似的多行 class1 1 28 9 315 13 354227 2 36 247 17 342 8 34 14 3825 class2 14 31 8679 7 32 3582 2 32 4127 1
  • 组合常见搭配的 NLP 流程

    我有一个语料库 我在 R 中使用 tm 包 并且还在 python 中的 NLTK 中镜像相同的脚本 我正在使用一元组 但希望某种解析器能够将通常位于同一位置的单词组合成一个单词 即 我不想再在我的单词中分别看到 New 和 York 当它
  • Matlab 替换轴范围

    我的 x 轴从 0 到 96 其中每个数字代表一天中的一刻钟 96 4 24 小时 我需要轴来显示 0 到 24 小时 有没有办法在绘图后仅修改轴 您可以使用 gt gt set gca XTick 0 4 96 gt gt set gca
  • 如何将嵌套字典传递给 Flask 的 GET 请求处理程序

    我试图将嵌套字典作为参数传递给 GET 请求 该请求由 Flask 工作线程处理 整个设置是Nginx Gunicorn Flask 在客户端 我正在执行以下操作 import requests def find cabin party P
  • Numpy:了解行名称的 numpy 数组概念

    也许是一个非常模糊的问题 但是挖掘 numpy 上的链接对我没有帮助 我需要使用以下分层聚类对如下所示的二进制数组进行相似度矩阵计算 name val1 val2 val3 val4 val5 comp1 0 0 1 0 1 comp2 1
  • 使用PHP批量删除域共享联系人

    我正在使用 Google API PHP客户端库 v2 1 3 https github com google google api php client 我正在关注以下文档域共享联系人 https developers google co
  • 使 saxon-c 在 Python 中可用

    我刚刚读到 Saxon 现在可用于 Python 这非常有趣而且很好 但是任何人都可以写一篇关于如何使其可用于 Python Anaconda WingIDE 或类似的教程吗 我习惯于使用 pip 或 conda 安装 并指向一个包 轮子以
  • xcode 5 问题:“iOS 模拟器无法安装应用程序”

    我刚刚将我的 xcode 版本升级到 5 0 运行应用程序 2 3 次后 它给我这样的错误 iOS模拟器无法安装应用程序 这在旧的 xcode 中工作正常 当我重置模拟器时 它工作正常 但这一次又一次令人恼火 谁能告诉我真正的问题是什么 我
  • DateTimePicker 显示今天的日期而不是显示其实际值

    我们在表单上的自定义用户控件上有几个 DateTimePicker 它们是可见的 但未启用 仅用于显示目的 当加载 UserControl 时 DateTimePicker 会从来自 DataSet 的 DataRow 分配值 该 Data
  • 什么时候需要在 Ruby C 扩展中声明易失性值?

    我找不到太多关于何时适合声明的文档VALUE as volatileRuby 扩展中以避免过早对正在使用的对象进行垃圾回收 这是我到目前为止所学到的 有人可以填空吗 When volatile does not需要使用 在 C 对象成员中