【问题标题】:Modifying array size at runtime在运行时修改数组大小
【发布时间】:2015-07-30 13:36:36
【问题描述】:

我想知道是否有可能在运行时声明数组大小而不使用 new 关键字。

struct myKernel
{
        uint8_t **var;
        myKernel(){}
        myKernel(const int number = 2)
        {
//I want to do something like
//var = new int*[number]; but not allocate it on the heap
           *var = a[number];
        }
        void operator()   
       {
        //do stuff here with the var array

       }
           
};

【问题讨论】:

  • 好吧,如果不在堆上,还有哪里?
  • “静态”是什么意思? var 不是 static 这里。此外,您应该使用std::vector<uint8_t*>,或者使用var = new uint_8*[number] 在堆上手动分配内存(如果静态是指“在堆栈上”,我不确定VLA 是否是标准C++ 正是因为@987654326 @ 我也不确定number 是否很大)。
  • 我虽然是在栈上分配的,解决方法是使用模板,一开始我没有想到,所以抱歉我还在学习,我会发布代码它....谢谢你

标签: c++ visual-studio functor


【解决方案1】:

如果您希望在运行时分配某些内容(即基于运行时信息),那么您必须使用基于堆的分配。

您需要的另一种选择是使用std::vectorresize,但在某处仍有一些动态分配。

【讨论】:

  • 可以动态分配给栈。这就是放置 new 的用途。
  • 我可能错了,但这不再是分配,它是从原始内存构造的,不是吗?我的意思是,如果您以这种方式使用placement new,则不会分配内存。
  • 我第二个 Ninetainedo,(如果我没记错的话)placement new 只构造对象,它假定您已经在您提供的地址分配了内存。因此,您可以在堆栈地址上使用placement new,但您必须事先分配一个(有时很大)固定大小且对齐良好的“缓冲区”。
  • 我的意思是你不必使用堆分配。您可以拥有一个堆栈内存池,然后使用它来创建运行时数组。它实际上可能不称为分配,但它是在运行时完成的。
  • 如果您不介意运行时分配,您绝对应该使用std::vector
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多