循环C ++中没有“new”关键字的多个对象

时间:2016-01-12 17:07:37

标签: c++ vhdl verilog synthesis vivado

我有一个场景,我需要在'for'循环的每次迭代中创建不同的对象。 这里的问题是我工作的合成器不支持“new”关键字。我正在使用的Synthesizer将C / C ++代码转换为RTL代码(硬件)。编译器不支持C ++中的许多构造。

我想实现这样的事情:

test inst[5];

for(int i=0;i<5;i++)

   inst[i].test_func();

我用Google搜索了这个问题,但我遇到的所有解决方案都使用了“new”关键字。 我需要一种方法在循环的每次迭代中创建不同的对象而不使用“new”关键字。有办法吗?

基本上我试图模仿VHDL中'For-generate'构造的行为。 非常感谢任何帮助或建议。

6 个答案:

答案 0 :(得分:1)

如果您无法动态分配内存,则必须使用重新定义operator newnew[]来使用静态分配池中的内存。您还必须实施operator deletedelete[]。我要说的是,除非你有一些东西要放宽对这种分配器的一般要求,否则这是一项艰巨的任务。

答案 1 :(得分:1)

我怀疑你最好忘记C ++的奇怪子集作为生成硬件的方法,并简单地用VHDL编写你想要的东西,VHDL是一种硬件描述语言,具有工作的工具。 / p>

虽然VHDL支持new进行仿真,但自然new不能用于综合,因为它意味着动态分配硬件资源......现在不存在任何ASIC或FPGA工具链。

据我所知,你只需要一个488个任意类型test对象的数组,并使用test_func()操作同时对所有这些对象进行操作(无论是什么) 。您可能需要for ... generate语句。

答案 2 :(得分:0)

我不确定这是否是您要找的,但您可以这样做:

class Test {};
class Test0 : public Test {};
class Test1 : public Test {};
class Test2 : public Test {};
class Test3 : public Test {};
class Test4 : public Test {};

static Test0 test0;
static Test1 test1;
static Test2 test2;
static Test3 test3;
static Test4 test4;

int main(int, char **)
{
   Test * tests[5] = {&test0, &test1, &test2, &test3, &test4};

   for (int i=0; i<5; i++)
   {
      Test * t = tests[i];
      // t->init_func();  // or etc
   }
   return 0;
}

答案 3 :(得分:0)

您可以预先分配所有对象并重复使用。我的意思是,假设你知道你最多只需要10个同时生活的物体。然后创建10个对象并将它们推送到未使用对象列表

每当您需要“创建”一个对象时,只需从未使用的对象列表中获取它。当您不再需要它时,您可以将其推回到该列表中。

答案 4 :(得分:0)

如果你知道每个对象的常量大小,你可以只分配一个chars数组,然后当你需要对象#i时,取指针。

int const size_of_obj_in_bytes = 20;
int const num_of_objects_to_allocate = 488;
char c[const num_of_objects_to_allocate*size_of_obj_in_bytes];

obj* get_ptr_to_obj_at_index(int i) {
   return (obj*)(&c[i*size_of_obj_in_bytes]);
}

答案 5 :(得分:0)

如果对象要存在于函数的上下文中,您可能可以利用堆栈分配(alloca)来处理它。您的子集应支持堆栈分配。您可以覆盖'new'方法以使用此函数(或任何可用于堆栈操作的方法)。

请记住,一旦离开父功能,所有功能都将被销毁。如果需要,您需要特别小心地调用析构函数。