何时使用alloca为类成员释放内存?

时间:2011-11-02 11:28:36

标签: c++ initializer-list alloca

class MyString
{
  public:
  MyString(int length):_ptr(alloca(length))
  {
  }
  //Copy Constructor, destructor, other member functions.
  private:
  void* _ptr;
};

int main()
{
  MyString str(44);
  return 0;
}

它是在main函数结束时释放还是在构造函数执行后立即释放? 如果上面的代码按预期工作,那么拥有这样的字符串类是个好主意吗?

更新

看起来主要的危险是

  1. StackOverflow
  2. 构造函数的内联
  3. 我认为我可以通过使用alloca用于小尺寸和malloc / free用于大尺寸来处理StackOverflow。我想必须有一些非可移植的编译器特定方式来强制编译器内联。

    我感兴趣,因为字符串类是在任何c ++项目中广泛使用的东西。如果我做对了,我期望获得巨大的性能提升,因为大多数分配都会进入堆栈,否则会进入堆。这将是一个实用程序,最终用户将不会意识到内部。

2 个答案:

答案 0 :(得分:5)

根据alloca的文档,当alloca的调用者返回时释放内存。因此,如果初始化列表被编译器视为构造函数的一部分,则在构造函数的末尾释放存储器,即在执行初始化列表之前创建堆栈帧。如果在执行初始化列表之后创建堆栈帧,则分配的内存将位于构造函数的调用者中,因此,在这种情况下,内存将在main的末尾释放。我不知道标准是否足以确定它会发生什么样的方式。

但是,只要最终释放内存,ptr的值就不会改变。

答案 1 :(得分:3)

类成员的初始化肯定是作为c'tor的一部分执行的。因此,至少按标准,alloca返回的指针的有效性仅限于c'tor。

因此,以您的方式初始化您的班级成员似乎是一个非常糟糕的主意。

OTOH以下内容没有问题:

class MyString
{
  public:
  MyString(void* ptr):_ptr(ptr)
  {
  }
  //Copy Constructor, destructor, other member functions.
  private:
  void* _ptr;
};

int main()
{
  MyString str(alloca(44));
  return 0;
}