是否可以将STL“链接”到装配程序,例如类似于连接glibc以使用像strlen等功能?具体来说,我想编写一个汇编函数,它将std :: vector作为参数,并将成为lib的一部分。如果可以的话,有没有关于此的文件?
答案 0 :(得分:1)
任何使用C ++模板都需要编译器生成这些模板的实例化。所以你并没有真正将STL之类的东西“链接”到一个程序中;编译器根据您在库中使用模板生成目标代码。
但是,如果您可以编写一些C ++代码来强制模板为您需要使用的任何类型和其他参数实例化,那么编写一些C-linkage函数来包装这些模板实例的用法,那么您应该是能够从汇编代码中调用它们。
答案 1 :(得分:1)
我坚信你做错了。使用汇编程序而不是将加快您对数据的处理速度。如果必须使用现有的汇编代码,只需传递原始缓冲区
根据定义(在标准中) std::vector
与原始缓冲区(数组)兼容;标准要求连续分配。只有重新分配才能使包含元素数据的内存区域无效。简而言之,如果C ++代码可以正确地知道所需的(最大)容量和reserve()
/ resize()
,那么您可以将&vector[0]
作为缓冲区地址并且非常高兴。
如果汇编代码需要决定如何(多)重新分配,让它使用malloc。完成后,您应该能够将该数组用作STL容器:
std::accumulate(buf, buf+n, 0, &dosomething);
或者,您可以使用std::tr1::array<T, n>
或boost::array<T, n>
是POD的事实,并使用新的 放置在库中分配的缓冲区(请参阅此处:{{ 3}}或placement new + array +alignment)
我怀疑你是因为错误的原因而使用装配。优化编译器将充分利用现代处理器的全部潜力(包括SSD,如SSE1-4);
E.g。对于gcc看看
__attibute__
(例如指针限制
例如对齐和别名保证:这将为编译器启用更强大的矢量化选项); -ftree_vectorize
和-ftree_vectorizer_verbose=2
,-march=native
另请注意,由于编译器无法确定哪些寄存器是外部(甚至是内联)汇编程序,因此必须假设所有寄存器都被破坏,导致潜在的性能下降。有关使用内联汇编的方法,请参阅How to make tr1::array allocate aligned memory?,并提供适当的gcc提示。
可能完全偏离主题:-fopenmp
和http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html