【发布时间】:2010-03-04 14:48:47
【问题描述】:
是否值得编写如下代码来复制数组元素:
#include <iostream>
using namespace std;
template<int START, int N>
struct Repeat {
static void copy (int * x, int * y) {
x[START+N-1] = y[START+N-1];
Repeat<START, N-1>::copy(x,y);
}
};
template<int START>
struct Repeat<START, 0> {
static void copy (int * x, int * y) {
x[START] = y[START];
}
};
int main () {
int a[10];
int b[10];
// initialize
for (int i=0; i<=9; i++) {
b[i] = 113 + i;
a[i] = 0;
}
// do the copy (starting at 2, 4 elements)
Repeat<2,4>::copy(a,b);
// show
for (int i=0; i<=9; i++) {
cout << a[i] << endl;
}
} // ()
还是使用内联函数更好?
第一个缺点是您不能在模板中使用变量。
【问题讨论】:
-
你应该只使用
std::copy。您几乎可以肯定 that 利用一些元编程技术将 int 数组之间的复制转发到 memmove。 -
天啊,我宁愿花 10 辈子的编程序言,也不愿再花时间看 C++ 编译时元编程 :(。如果你要复制一些东西,你就必须复制它,你无法逃脱通过认为你可以在编译时执行它只是因为你认为你可以识别将被复制的变量
-
@Hassan:根据数据类型和对齐方式,不同的复制策略可能是合适的,并且可能会显着加快操作速度。它不是“只是一个副本”。 (但正如@UncleBens 所说,
std::copy已经这样做了) -
这很有帮助。这是我见过的唯一解决方案,您可以在其中指定在代码中展开多少。我用 Repeat 查看了 GCC 中的程序集输出,它展开了 100 次。尽管许多人声称,循环展开仍然对性能有用。如果您知道自己在做什么,很容易击败
memcpy或std::copy。但展开在其他情况下更有用,例如 z[i] = x[i] + y[i]。
标签: c++ templates metaprogramming