我有一个场景,我需要在'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'构造的行为。 非常感谢任何帮助或建议。
答案 0 :(得分:1)
如果您无法动态分配内存,则必须使用重新定义operator new
和new[]
来使用静态分配池中的内存。您还必须实施operator delete
和delete[]
。我要说的是,除非你有一些东西要放宽对这种分配器的一般要求,否则这是一项艰巨的任务。
答案 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'方法以使用此函数(或任何可用于堆栈操作的方法)。
请记住,一旦离开父功能,所有功能都将被销毁。如果需要,您需要特别小心地调用析构函数。