【问题标题】:Overhead of type "alias" in GoGo 中“别名”类型的开销
【发布时间】:2013-07-06 12:17:58
【问题描述】:

我正在写vector.go 作为我程序的一部分。它提供了一个三维的vector 结构和一些向量操作。

为了与一般vector类型对称,我想提供一个scalar类型:

type scalar float64

我喜欢这样,因为我没有理由每次都指定标量的精度。它们是 64 位的事实是我宁愿只指定一次的细节。

唯一的问题是我知道这不像 C 语言中的typedef。幕后似乎还有更多事情要做。我的问题:这会产生任何开销吗?如果是这样,时间和多少?当性能绝对关键时,我可以使用它吗? (假设我将每次出现的float64 替换为scalar 并转换文字,例如scalar(1.0)。)

【问题讨论】:

    标签: types go overhead type-alias


    【解决方案1】:

    首先,不需要转换文字。 x = 1.0x = scalar(1.0) 相同,假设 x 已经具有标量类型。

    在 Go 中,没有用户定义类型别名之类的东西。在 Go 中,byte 和 uint8(它们是内置类型)被认为是彼此的别名。它们是同一类型的两个名称。 Float64 和标量不是同一类型。 float64 和标量的值需要使用 s = scalar(f) 之类的东西相互转换,而 byte 和 uint8 则不需要。

    但是,此类转换没有开销。这些类型在编译时强制执行以确保代码正确性,但不会影响执行期间的性能。仅当您键入断言或使用反射时,执行才会受到影响。但是,这些差异会影响逻辑,而不是性能。

    当性能非常关键时我可以使用它吗?

    是的

    【讨论】:

    • 谢谢。对于字面意思,我更多地考虑x := scalar(1.0)(或等效var x scalar = 1.0)以防止1.0被推断为float64。
    猜你喜欢
    • 2019-06-21
    • 2018-05-11
    • 2013-11-03
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多