【问题标题】:C++11 Stack Allocation vs Unique_Ptr [duplicate]C ++ 11堆栈分配与Unique_Ptr [重复]
【发布时间】:2016-04-25 22:30:00
【问题描述】:

我正在使用 C++11。我意识到我可以做到这一点并在堆栈上分配:

void someclasS::somefn(int naz) {
    Ipp32f absValues[naz] // <--naz is dynamic
    //.....more code
    //.....
}

我以为我不应该这样做? 以前我是这样做的:

std::unique_ptr<Ipp32f[]> absValues(new Ipp32f[naz]); 
// when need to pass pointer have to use absValues.get()

为了避免不得不删除内存。

如果可能的话,我非常愿意做前者,因为它看起来更整洁。但是这样做的后果是什么,如果有的话?

【问题讨论】:

  • 是的。在这里查看它,编译并工作。使用带有 std11 标志的 gcc 的 eclipse。

标签: c++ variables c++11 stack unique-ptr


【解决方案1】:

这是因为编译器接受VLAs,即使它们在 C++ 中不是标准的。

正常的方法是使用 std::vector,正如 Humam Helfawi 所说。

不允许 VLA 的理由是,要么您确定没有堆栈溢出,因为大小有上限(在这种情况下,只需分配该大小),要么数量不受限制,您确实应该分配它在空闲存储上,因为这样可以更好地处理内存不足的情况。

【讨论】:

  • 你说的上限是什么?多少钱?
  • 嗨..我读到它通常在 4mb 左右......这非常小。
  • @lppier:我的意思是,如果你确定说n &lt;= 100,那么在堆栈上分配int[n] 将是相当安全的,但在这种情况下,你可以只分配@987654325 @ 相反,不需要 VLA。另一方面,如果n 可以获取的内容没有上限,那么在堆栈上分配int[n] 可能是个坏主意,因为堆栈溢出是未定义的行为,而空闲存储上的内存耗尽会得到正确的信号。跨度>
【解决方案2】:

如果可能的话,我非常愿意做前者,因为它看起来更整洁

只需使用std::vector

std::vector<Ipp32f> absValues(naz);

如果您有一个具有此声明的函数,则结果是连续的:

ppsZero_32f(Ipp32f* ptr, int len);

你可以像这样传递你的向量:

ppsZero_32f(absValues.data(),absValues.size());

【讨论】:

  • 结果会在内存中连续吗?我需要将 absValues 传递给 ipps 样式函数,例如。 ippsZero_32f(Ipp32f* ptr, int len)
  • 是的,当然是连续的
  • 我使用 std::unique_ptr) (void)> var(ippsMalloc_32f(az), ippsFree);声明一下,与此等效的向量是什么?
  • ippsFree 在哪里?不能是 Ipp32f 描述符的一部分吗?
  • 这是一个intel ipp函数来释放Ipp32f声明的内存
猜你喜欢
  • 2017-08-12
  • 2011-12-01
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 2011-05-28
  • 2017-05-06
  • 2014-11-29
相关资源
最近更新 更多