C++ 中针对大型的堆栈分配

Stack allocation in c++ for large sizes

本文关键字:堆栈 分配 大型 C++      更新时间:2023-10-16

我正在尝试使用 Direct3D 9 加载大量基元,因此我需要将大量结构数组传递给虚拟缓冲区。但是如果我用 malloc() 来做,我的 sizeof() 函数返回一个错误的值(总是 4)。如果我通常分配堆栈内存(array[number]),堆栈可能会因为元素数量而溢出。还有其他选择吗?如何分配可以加载尽可能多的数据的堆栈内存?

附言我不会将它们全部绘制到屏幕上,但我仍然需要它们的顶点信息。

当与指针一起使用时,sizeof运算符返回指针的大小,而不是它指向的内容。

当您动态分配内存时(C++使用 new 而不是 malloc ),您需要自己跟踪条目的数量。或者更好的是,使用例如 std::vector .

如果您调用 malloc,则使用所需的空间大小调用它。如果你以后想知道分配有多大,你需要把这些信息放在自己身边。

由于您使用C++,因此您可以使用如果您调用 malloc,则使用所需的空间大小来调用它。如果你以后想知道分配有多大,你需要把这些信息放在自己身边。

如果这太麻烦了,因为你的使用C++,你可以使用一个<vector>或类似的,它会跟踪它自己的大小。 一个矢量或类似的东西,它将跟踪它自己的大小。

是的,

malloc()然后使用 sizeof() 会给你 4。这就是指针大小。

如果您只是想知道如何在 ptr 中填写您的值,请参考下面的代码:

int numOfItems = 10;
int* pArr = (malloc(sizeof(int)*numOfItems);
for (int i=0;i<numOfItems;i++)
    pArr[i] = i+1;

最好的选择可能是动态分配 std::vector 并使用智能指针。

std::shared_ptr< std::vector< your data type> > vertices( new std::vector( number );

现在你不会溢出堆栈,所有相关的内务处理都是由 std::vector 和 std::shared_ptr 完成的,最重要的是内存将被删除。