C++11 堆栈分配与 Unique_Ptr
C++11 Stack Allocation vs Unique_Ptr
我正在使用 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()
为了避免删除内存。
如果可能的话,我非常想做前者,因为它看起来更整洁。但这样做的后果是什么,如果有的话?
I would like very much to do the former if possible as it looks neater
只需使用std::vector
。
std::vector<Ipp32f> absValues(naz);
如果你有一个带有此声明的函数,结果是连续的:
ppsZero_32f(Ipp32f* ptr, int len);
您可以像这样传递向量:
ppsZero_32f(absValues.data(),absValues.size());
之所以有效,是因为编译器接受 VLAs,即使它们在 C++ 中不是标准的。
正常的方法是使用 std::vector
正如 Humam Helfawi 所说。
不允许 VLA 的理由是您确定没有堆栈溢出,因为大小有上限(在本例中只是分配该大小),或者数量是无限的,您确实应该将它分配到空闲存储区,因为这样可以更好地处理内存不足的情况。
我正在使用 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()
为了避免删除内存。
如果可能的话,我非常想做前者,因为它看起来更整洁。但这样做的后果是什么,如果有的话?
I would like very much to do the former if possible as it looks neater
只需使用std::vector
。
std::vector<Ipp32f> absValues(naz);
如果你有一个带有此声明的函数,结果是连续的:
ppsZero_32f(Ipp32f* ptr, int len);
您可以像这样传递向量:
ppsZero_32f(absValues.data(),absValues.size());
之所以有效,是因为编译器接受 VLAs,即使它们在 C++ 中不是标准的。
正常的方法是使用 std::vector
正如 Humam Helfawi 所说。
不允许 VLA 的理由是您确定没有堆栈溢出,因为大小有上限(在本例中只是分配该大小),或者数量是无限的,您确实应该将它分配到空闲存储区,因为这样可以更好地处理内存不足的情况。