【发布时间】:2011-10-22 12:38:09
【问题描述】:
我有一个简单(但性能关键)的 C (嵌入在 C++ 中)算法来操作数据缓冲区......该算法“自然”使用 64 位大端寄存器值 - 我想优化这使用汇编程序来直接访问进位标志和 BSWAP,因此避免了一次操作一个字节的 64 位值。
我希望解决方案能够在操作系统/编译器之间移植 - 最低限度地支持 GNU g++ 和 Visual C++ - 以及分别在 Linux 和 Windows 之间移植。对于这两个平台,显然,我假设处理器支持 x86-64 指令集。
我找到了this document about inline assembler for MSVC/Windows,并通过 Google 找到了几个片段,详细说明了 g++ 的不兼容语法。我接受我可能需要在每种方言中单独实现此功能。我无法找到足够详细的关于语法/工具的文档来应对这一发展。
我正在寻找的是详细说明我可用的工具的清晰文档 - 包括 MS 和 GNU 工具集。虽然我多年前编写了一些 32 位汇编程序,但我已经生疏了 - 我会从汇编级别提供的简明文档中受益。
更复杂的是,我想使用 Visual C++ Express Edition 2010 为 Windows 编译...我知道这是一个 32 位编译器 - 但我想知道是否可以嵌入 64 位汇编成它的可执行文件?在我打算手工编码的部分,我只关心 64 位性能。
任何人都可以提供任何指针(请原谅双关语...)?
【问题讨论】:
-
对不起,但我相信当您需要可移植代码时,请将其保留在 C++ 代码中。测试该代码会遇到很多问题。但是,对于 32 位和 64 位,它们是不同的可执行文件,因此您可以使用 #ifdef _M_IX86 ... 使用 32 位 c 代码 ... #else ... 使用您的 64 位代码 ... #endif。
-
我还必须补充一点,现代编译器对代码进行了很多优化,不知道这是否真的值得付出努力,在考虑将其移植到其他语言之前,您应该进行一些性能测试。尝试使用 MSVC,然后检查是否值得。
-
我确信我发现了一种情况,即访问 BSWAP 和进位标志将产生显着的好处。我很高兴实现多个版本(由预处理器指令保护) - 但我仍然需要建立可以在每个上下文中使用的语法。
-
你在 MSVC 内部观看了吗?也许有你需要的东西。 msdn.microsoft.com/en-us/library/azcs88h2.aspx
标签: c++ assembly g++ x86-64 visual-c++-2010