【发布时间】:2010-08-01 02:27:59
【问题描述】:
假设您编写了可在不同平台上流畅运行的可移植 C++ 代码。要进行一些修改以优化性能,您可以在代码中使用内联汇编。这是一个好的做法(编译器优化放在一边)还是会给可移植性带来麻烦?
【问题讨论】:
标签: c++ optimization assembly x86 portability
假设您编写了可在不同平台上流畅运行的可移植 C++ 代码。要进行一些修改以优化性能,您可以在代码中使用内联汇编。这是一个好的做法(编译器优化放在一边)还是会给可移植性带来麻烦?
【问题讨论】:
标签: c++ optimization assembly x86 portability
显然它破坏了可移植性 - 代码仅适用于汇编语言所针对的特定架构。此外,这通常是在浪费时间——编译器的优化器几乎肯定比你更擅长编写汇编代码。
【讨论】:
显然,内联程序集甚至不是可移植的。为了保持任何可移植性,您通常必须使用#ifdef(或该订单上的其他内容)来确定何时使用它。
我自己的偏好是将汇编语言分离到一个单独的文件中,并在 makefile 中决定是构建可移植版本还是汇编语言版本。
【讨论】:
视情况而定。
如果您只有 x86 程序集,您的应用程序将永远无法在 ARM 和本机 x64 上运行。为了解决这个问题,您可以根据架构用#ifdef 包围它。这是跨平台、高度优化的库(如 h264)使用的方法。但是,在大多数情况下,这是不值得的。只需使用非常具体的 C,它的行为就会与原生汇编非常相似。
【讨论】:
另一个明显的选择是只在某些架构上实现内联汇编,并为任何其他架构保留原始(未优化的)C++,而不是尝试为所有架构生成汇编。 (当然,#ifdefed 比较合适。)然后您就可以从一个架构上的优化中受益,并在所有架构上提供基本功能。
但是,当我们对我过去从事的项目进行此操作时,这是维护起来最糟糕的部分 - 其他一些代码会改变,以及传递给隔离函数的确切内容(s ) 会发生变化,原来的 C++ 和程序集就不再匹配了,很多人都在哭泣和咬牙切齿。
【讨论】: