在GNU汇编程序中使用STL容器

时间:2011-06-20 14:27:00

标签: stl assembly

是否可以将STL“链接”到装配程序,例如类似于连接glibc以使用像strlen等功能?具体来说,我想编写一个汇编函数,它将std :: vector作为参数,并将成为lib的一部分。如果可以的话,有没有关于此的文件?

2 个答案:

答案 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提示。

可能完全偏离主题:-fopenmphttp://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

奖励:以下关于程序集和c ++中(过早)优化的参考可能会派上用场:

以及其他一些The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers