英文:
Inlining functions in Go
问题
Go语言使用通用的sort.Interface
实现了一个很好的introsort。但是C++的std::sort
的一个优点是可以指定一个内联的比较函数,并且可以省略不必要的函数调用。
我们能否通过某种方式强制当前的原生Go编译器内联这些sort.Swap
和sort.Less
调用?我不考虑使用gccgo
,因为与原生编译器相比,它给我们带来了糟糕的结果。
英文:
Go has a nice generic implementation of introsort using the generic sort.Interface
. But one of the advantages of C++'s std::sort
is that you can specify a compare functor which is inlined and unnecessary function calls are omitted.
Can we force the current native Go compilers somehow to inline those sort.Swap
and sort.Less
calls? I do not consider gccgo
because it gives us terrible results compared to the native compiler.
答案1
得分: 3
对于Go 1.x版本来说,答案是否定的。
Go编译器可能会在某些特定平台上以某些特定方式内联一些函数类别。你甚至可能能够通过某些手段让当前的编译器在你的架构上内联sort-"functor",但绝对不能保证这在未来的版本中仍然有效,而且这可能会对你产生负面影响(甚至破坏你的代码,取决于所涉及的技巧水平)当编译器发生变化时。
Go的一个重大发布版本(2.x?)可能会对优化提供一些保证;但对于Go 1.x来说,并没有类似的保证。而且,即使Go的作者想要这样做,为所有平台提供这样的保证也很困难(请记住,Go可以在许多架构上运行)。
更一般地说,在任何语言中依赖于编译器特定行为都是一个坏主意。
英文:
For Go 1.x the answer is a sound no.
The Go compiler may inline some classes of functions on some platforms in some specific ways. You might even be able to figure out some trickery through which you can make the current compiler inline the sort-"functor" on your architecture but there is absolutely no guarantee whatsoever that this will hold in future releases and it may work against you (even break your code, depending on the level of hackery involved) when the compiler changes.
A major release of Go (2.x?) might provide some guarantees about optimizations; but for Go 1.x there's nothing like that. And even if the Go authors wanted to do this it's difficult to provide such guarantees for all platforms (remember Go runs on many architectures).
Even more generally it is a bad idea to rely on compiler-specific behavior, in any language.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论