我正在研究表达式模板和mshadow代码库。在他们的wiki页面here中,他们提供了一个不好的解决方案的例子,因为它进行了时间内存分配和释放。那是什么以及给定代码如何做这样的事情?
推荐代码:
// Naive solution for vector operation overloading
struct Vec {
int len;
float* dptr;
Vec(int len) : len(len) {
dptr = new float[len];
}
Vec(const Vec& src) : len(src.len) {
dptr = new float[len];
memcpy(dptr, src.dptr, sizeof(float)*len );
}
~Vec(void) {
delete [] dptr;
}
};
inline Vec operator+(const Vec &lhs, const Vec &rhs) {
Vec res(lhs.len);
for (int i = 0; i < lhs.len; ++i) {
res.dptr[i] = lhs.dptr[i] + rhs.dptr[i];
}
return res;
}
答案 0 :(得分:1)
在这种情况下,他们谈论的是在内存中分配一些空间以暂时保存值。
例如,当你做
时a = a + b;
编译器将执行以下操作
a
和b
的总和,并将结果写入该块a
正如您所看到的,没有理由做#1或#3,因为总和的值实际上可以直接进入a
。
现在你可能会问:为什么编译器不能理解a=a+b
和a+=b
是一样的。答案是因为虽然对于int
,double
,size_t
这总是如此,但是可以实现一个类,其中这两个运算符执行不同的操作。看看std::ofstream
如何使用left bitshift运算符来完成不同的操作。