什么是临时内存分配?

时间:2017-12-02 15:49:06

标签: c++ memory memory-management

我正在研究表达式模板和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;
} 

1 个答案:

答案 0 :(得分:1)

在这种情况下,他们谈论的是在内存中分配一些空间以暂时保存值。

例如,当你做

a = a + b;

编译器将执行以下操作

  1. 分配新的内存块
  2. 计算ab的总和,并将结果写入该块
  3. 将结果从临时存储空间复制到a
  4. 正如您所看到的,没有理由做#1或#3,因为总和的值实际上可以直接进入a

    现在你可能会问:为什么编译器不能理解a=a+ba+=b是一样的。答案是因为虽然对于intdoublesize_t这总是如此,但是可以实现一个类,其中这两个运算符执行不同的操作。看看std::ofstream如何使用left bitshift运算符来完成不同的操作。