【问题标题】:What is the "atom" data type?什么是“原子”数据类型?
【发布时间】:2012-05-18 12:35:14
【问题描述】:

我在Win32api 中遇到过ATOM 类型,并且在Acrobat API 中也有ASAtom。

据我所知,原子是哈希表的键,通常是字符串,以实现快速查找并在应用程序之间共享数据。这是正确的吗?原子类型的词源是什么?

编辑

经过一番广泛的搜索,我注意到Prolog 使用了原子,所以这个词一定有一些来源。它似乎用于引用任何单个数据。

【问题讨论】:

  • 是的,这个词有一个起源。它来自希腊词ἄτομος(atomos),意思是“不可分割的”。 (舌头在脸颊......)
  • 我认为 X11 也有 Atom 的概念——允许客户端应用程序在 X 服务器中存储一段数据。
  • @Mehrdad:这很有帮助,它可以解释为什么 ATOM 被定义为 typedef WORD ATOM 因为单词是 CPU 的可寻址单元(即不可分割)。
  • @JesseGood: 哈哈是的......除了它应该是更大的类型,比如UINT_PTR,因为现在的 CPU 处理 32 位和 64 位块。 :)
  • @Mehrdad:在 Windows 上定义为 unsigned short(可能是因为它源自 16 位窗口,但 Acrobat API 将其定义为 unsigned long。

标签: c++ winapi types


【解决方案1】:

ATOM 是一个 16 位 Windows 类句柄原语。它的值对用户模式完全不透明。它不是指针或索引。

typedef 无符号短 ATOM;

【讨论】:

  • 我猜它们是使用一些内部散列函数生成的?
  • 没有。它们是内核模式下句柄表的索引。它们是故意不透明的,因为将内核模式指针泄漏到用户模式是违反安全性的。
  • 感谢您的帮助。似乎 windows 在内部使用原子来有效地存储和检索字符串。
  • (我在我的问题中链接到同一个站点)
  • @SecurityMatt:不应该取消引用内核模式指针触发 STATUS_ACCESS_VIOLATION。
【解决方案2】:

至于ATOM这个名字的词源,我知道我曾经在一些旧的Microsoft Win32 API文档中看到它是“Access to Memory" 或类似的东西。它是用于表示系统中一些内部数据结构的简单数字标识符(其他名称是“句柄”)的术语。

出于显而易见的原因,向用户提供指向这些结构的直接指针并不明智。首先,因为它们驻留在内核空间中,其次,因为它违反了封装。然后用户可以释放不属于它的内存,或者覆盖它,或者其他一些愚蠢的想法。所以操作系统只是给它一些替换数字标签(即ATOM),然后可以用来从系统请求数据。用户传递小数字而不是整个巨大的数据结构也更快。用户不需要关心内存分配和其他东西,或者通过不再有效的指针访问一些数据,这可能会使他们的程序崩溃。

【讨论】:

  • 用户不需要关心内存分配......你知道ATOM表也有限制,对于全局原子表尤其如此。
  • 你误会了。我说的不是分配space,而是分配method。也就是说,用户不必关心如何为这些对象分配内存以及在哪里分配内存,他们不需要处理分配、释放和检查无效指针的所有麻烦。但当然,他们仍然需要关心他们为资源分配了多少内存。但我认为这是显而易见的。
  • 是的,我们俩都很清楚。你的回答似乎还是有点过于乐观。你为什么不直接说减少内存管理中最烦人的方面(资源泄漏、悬空指针)? 分配本身可能会失败,这当然必须检查。
  • 当然,但正如我所说,这些是与最初提出的问题无关的不重要的细节。为什么要费心陈述显而易见的事情呢?如果原始海报没有询问他们,我认为他很聪明并且知道这些细节。他只问什么是ATOM。但是,如果您不这么认为,为什么不添加自己的答案呢?
  • 词源几乎可以肯定是回形。它来自 Lisp。符号是 Lisp 中的“原子”。当 Lisp 阅读器读取符号标记时,它变成一个字符串,立即“内嵌”:转换为符号。符号可以作为指针进行比较:如果符号 A 等于 B,我们就知道它们是同一个原子;我们不必对它们的字符串名称进行逐个字符的比较。在 X Windows 系统中,使用 Lisp 的“实习生”术语,将字符串转换为 XAtom 称为 XInternAtom。 Windows 可能从那里抄袭了“原子”。
【解决方案3】:

我能找到的关于“原子”一词的最早内容来自 Lisp 编程语言 (source)。但是,它可能最初来自mathematical logic。在编程中,它们也被称为Symbols,最简单的形式是名称整数(C 中的枚举类型就是一个例子)。但是,它们广泛用于许多编程语言,在 Win32 API 和 Acrobat API 中,它们是表中字符串的标识符。

另外,正如Mehrdad 指出的那样,希腊语的原意是“不可分割的”,因此它们暗示了一种无法进一步分解的原始数据类型。

【讨论】:

  • 这就是为什么原子的名称(物理/化学的东西)可以说是不正确的。
【解决方案4】:

RegisterClass / RegistrClassEx 函数(以及其他一些函数)返回 ATOM 数据类型。

ATOM 唯一标识正在注册的类,但如果函数失败,则返回零,因此您可以像这样测试函数是否失败

ATOM a=0;
.
.
a = RegisterClassEx(your_window);
if (0==a)
  {
    //code for function failed
  }

【讨论】:

  • 你能说出更多返回 ATOM 的函数吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 2012-08-25
  • 2016-08-25
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多