【问题标题】:Does Swift have tagged pointers?Swift 有标记指针吗?
【发布时间】:2016-06-05 19:00:37
【问题描述】:

Objective-C 使用称为tagged pointers 的花哨的东西来减少内存使用并提高处理某些小对象类型(如strings, dates, and numbers)时的速度。基本上,如果对象中的所有数据都可以放入指针中,则运行时会将其放在那里,而不是分配和跟踪堆内存。

Swift 有类似的机制吗?

【问题讨论】:

  • 这是一个性能问题吗?这似乎与我们将如何使用 Swift 没有太大关系...
  • 是的,标记指针实际上并不重要,尽管它们确实意味着获得的收益比人们想象的要少,例如,从循环创建 NSNumbers 切换直接使用int64_ts(或任何合适的大小)。这只是出于好奇而提出的问题。
  • Swift 字符串和数字已经是值类型而不是引用类型,因此没有指向标记的指针。基础字符串和数字是引用类型,可以标记为指针。
  • @Darren Swift 字符串和数字以及其他值类型表现类似于值类型。这是一个实现细节,无论它们是在堆栈还是堆上分配(也就是指针)。
  • @TomHamming 你肯定知道,标记指针对开发人员是透明的。所以 Swift 中的标记指针也是透明的。所以这是一个实现细节的问题。但是,我很确定 if 某些东西是使用引用实现的,他们会在 Swift 中选择相同的优化。一些(全部?)Swift 人来自 clang/rte 团队。他们知道 Objective-C 是做什么的。

标签: objective-c swift performance pointers


【解决方案1】:

来自The Swift ABI

类布局

Swift 依赖于以下关于 Objective-C 运行时的假设,因此这些假设现在是 Objective-C ABI 的一部分:

  • (有关 Objective-C 标记指针布局的信息 ...)

以下假设是 Swift ABI 的一部分:

  • Swift 类指针永远不会被标记。

据我了解,Swift 处理 Objective-C 标记的指针,这些指针是 从 Objective-C 运行时获得(例如NSNumberNSDate), 但不对纯 Swift 类使用标记指针。

【讨论】:

  • 你的引用不完整,因为在那之前有一堆关于 Swift 在处理 Objective-C ABI 时如何确实使用标记指针的评论,这是很常见的用例。
  • 当,这有点不幸。但可以理解,因为在 Swift 中可能没有与 objc_msgSend 等效的东西,它可以是作用于标记指针的 One Place。
  • 有一个等价物:编译器。 Objective-C 中 RTE 所做的所有事情都是由编译器完成的。 If——这很重要——它在编译时是可决定的。所以 Swift 可以对数字文字 i 使用标记指针。 e.但在这种情况下,将其归结为普通标量似乎更好。我不认为在 Swift 中使用标记指针会有很大的压力。
  • @MartinR 我不认为最后一条语句可以理解 Swift 中从来没有标记指针。它只是说指向 classes 的指针永远不会被标记。数字不是 Swift 中的类。 – 因此,如果有一种情况让编译器决定将指针用于标量值(如整数),您根本无法说 Swift 是否会选择标记指针。
  • @AminNegm-Awad:抱歉,我没听懂。标记指针是关于指向对象的指针。这是一种“优化”,其中指针不指向对象,但本身包含信息。 (在我看来)谈论与非类类型相关的标记指针是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 2021-12-25
  • 2013-12-20
  • 1970-01-01
  • 2013-06-27
相关资源
最近更新 更多