繁体   English   中英

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

[英]When is memory allocated using alloca freed for class members?

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. 堆栈溢出
  2. 内联构造函数

我想我可以通过使用alloca来实现小尺寸和malloc / free来处理大尺寸的StackOverflow。 我想必须有一些非可移植的编译器特定方式来强制编译器内联。

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

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

但是,每当最终释放内存时, ptr的值将保持不变。

绝对地,类成员的初始化作为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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM