【问题标题】:Does inline assembly mess with portability?内联汇编会影响可移植性吗?
【发布时间】:2010-08-01 02:27:59
【问题描述】:

假设您编写了可在不同平台上流畅运行的可移植 C++ 代码。要进行一些修改以优化性能,您可以在代码中使用内联汇编。这是一个好的做法(编译器优化放在一边)还是会给可移植性带来麻烦?

【问题讨论】:

    标签: c++ optimization assembly x86 portability


    【解决方案1】:

    显然它破坏了可移植性 - 代码仅适用于汇编语言所针对的特定架构。此外,这通常是在浪费时间——编译器的优化器几乎肯定比你更擅长编写汇编代码。

    【讨论】:

    • “编译器的优化器几乎肯定比你更擅长编写汇编代码。” - 不幸的是,仅仅打开 SIMD 之类的东西几乎和编写一小段汇编代码一样具有挑战性;-)
    • 周围很少(很少)人比编译器更擅长汇编。即使有优化,新版本的编译器很可能很快就会包含该优化,因此只需重新编译您的代码即可为您提供更好的代码(而必须持续维护 assemble)。
    • 对于非 SIMD x86,编译器通常胜过人类。对于有序 CPU,经验丰富的汇编语言程序员似乎比争取机会更好......
    【解决方案2】:

    显然,内联程序集甚至不是可移植的。为了保持任何可移植性,您通常必须使用#ifdef(或该订单上的其他内容)来确定何时使用它。

    我自己的偏好是将汇编语言分离到一个单独的文件中,并在 makefile 中决定是构建可移植版本还是汇编语言版本。

    【讨论】:

    • 另外,请注意,仅仅因为这段代码是一个平台上已证明的瓶颈,并且仅仅因为您设法通过汇编编码提高了该平台上的性能,并不意味着这些事情中的任何一个在其他平台上将是真实的。所以原始代码仍然是新平台上的第一次尝试,直到正确配置。
    【解决方案3】:

    视情况而定。

    如果您只有 x86 程序集,您的应用程序将永远无法在 ARM 和本机 x64 上运行。为了解决这个问题,您可以根据架构用#ifdef 包围它。这是跨平台、高度优化的库(如 h264)使用的方法。但是,在大多数情况下,这是不值得的。只需使用非常具体的 C,它的行为就会与原生汇编非常相似。

    【讨论】:

    • 恕我直言,更好的解决方案是将带有汇编语言的函数放入单独的汇编语言源文件中。让构建过程根据目标平台选择正确的源文件。
    【解决方案4】:

    另一个明显的选择是只在某些架构上实现内联汇编,并为任何其他架构保留原始(未优化的)C++,而不是尝试为所有架构生成汇编。 (当然,#ifdefed 比较合适。)然后您就可以从一个架构上的优化中受益,并在所有架构上提供基本功能。

    但是,当我们对我过去从事的项目进行此操作时,这是维护起来最糟糕的部分 - 其他一些代码会改变,以及传递给隔离函数的确切内容(s ) 会发生变化,原来的 C++ 和程序集就不再匹配了,很多人都在哭泣和咬牙切齿。

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2011-01-31
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多