-1

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

我想实现这样的事情:

test inst[5];

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

   inst[i].test_func();

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

本质上,我试图在 VHDL 中模拟“生成”构造的行为。非常感谢任何帮助或建议。

4

6 回答 6

1

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

于 2016-01-12T17:11:30.367 回答
1

我怀疑你最好忘记 C++ 的奇怪子集作为生成硬件的一种手段,而只需用 VHDL 编写你想要的东西,VHDL 作为一种硬件描述语言,具有完成这项工作的工具。

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

据我所知,您只需要一个包含 488 个对象的数组,无论test是什么类型,并在操作的同时对所有对象进行test_func()操作(无论是什么)。你可能想要一个for ... generate声明。

于 2016-01-13T17:07:31.853 回答
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;
}
于 2016-01-12T17:40:47.777 回答
0

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

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

于 2016-01-12T17:41:04.607 回答
0

如果您知道每个对象的常量大小,您可以分配一个字符数组,然后当您需要对象#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]);
}
于 2016-01-12T20:29:22.413 回答
0

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

请记住,一旦你离开父函数,所有的都会被销毁。如果需要,您需要格外小心地调用析构函数。

于 2017-06-18T16:09:47.603 回答