正确调用内联汇编的方法

时间:2016-03-12 02:59:37

标签: c++ assembly

我正在探索在C ++源代码中包含汇编。它似乎从调用func handler(w http.ResponseWriter, r *http.Request) { // Make your api call and prepare the `Payload` object (from your example in the question) for i := 0; i < len(p.Results); i++ { fmt.Println(p.Results[i].Overview) // Prints to your terminal } // Following sends same information as above to the browser as html t, err := template.New("foo").Parse(` {{define "T"}} <html><ul>{{range .Results}}<li>{{.Overview}}</li>{{end}}</ul></html> {{end}}`) err = t.ExecuteTemplate(w, "T", p) // This writes the client response } 开始,但我也看到了asm()_asm()。下划线之间有什么区别?如果相关,我最感兴趣的是GNU编译器。

编辑:来自this forum

__asm()

不确定这是真的还是假的?

3 个答案:

答案 0 :(得分:6)

C ++没有标准的,可移植的方式来包含内联汇编。几乎按照定义,内联汇编是一种非标准的,非便携式的东西。

但是,如果您已经对应用程序进行了概要分析,并发现它需要在特定区域进行调优,而这些区域通过优化的C ++和/或内在函数不能很好地提供服务,我建议您放置程序集进入自己的文件,这些文件由适当的工具有条件地组装,用于运行代码的每个平台。对于那些不支持汇编语言的平台,您还需要本机C ++实现。

顺便说一下,我过去使用过GNU的内联asm变种,我不得不说它们往往会使你的代码看起来非常丑陋并且对另一个程序员不透明。如果您正在编写只需要具有最大带宽的裸机代码,那么,好吧,但是如果您想要长期可维护的东西......可能会对性能有所帮助。

答案 1 :(得分:3)

使用GNU C / C ++编译器,asm_asm__asm__asm__关键字都意味着做同样的事情。在为GCC编写内联汇编时,asm关键字是您通常应该使用的关键字。在大多数情况下,如果您看到任何其他关键字使用它是一个错误,作者不必要地键入额外的字符。 __asm__关键字仅适用于需要与GCC严格一致性选项之一兼容的头文件。

GCC使用asm关键字与C和C ++标准不兼容。这些标准允许程序使用asm作为标识符,例如,在变量或函数名称中。通常GCC不允许这样做,但是在严格的一致性模式(例如-std=c99)中,它不会将asm视为关键字,因此可以将其用作标识符。使用内联汇编并打算在各种不同项目中使用的头文件可以使用__asm__关键字而不是asm

其他两个关键字_asm__asm根本不应该使用,因为它们似乎没有正式记录。

答案 2 :(得分:0)

@Aiken鼓提供了一个很好的答案,所以我不会重申他的观点(虽然我认为他们需要仔细考虑)但我认为你的问题更多的是询问关键词之间的差异。

基本上与下划线版本没有区别,它们只是由不同的编译器使用。您需要为编译器和编译器设置确定正确的版本。对于gcc / clang,我认为这是asm__asm__(可能受编译器选项的影响),对于MSVC,这是__asm。英特尔使用asm__asm__asm__。我不确定编译器使用_asm

许多差异是避免内联汇编程序的另一个好理由,但你真的应该避免汇编程序完全停止。

相关问题