У меня есть сценарий, где мне нужно создавать разные объекты в каждой итерации цикла for.
Подвох в том, что синтезатор, с которым я работаю, не поддерживает ключевое слово «new». Синтезатор, который я использую, переводит код C / C ++ в код RTL (Hardware). Так что многие конструкции в C ++ не поддерживаются компилятором.
Я хочу реализовать что-то вроде этого:
test inst[5];
for(int i=0;i<5;i++)
inst[i].test_func();
Я погуглил эту проблему, но все решения, с которыми я столкнулся, используют ключевое слово «new».
Мне нужен способ создавать разные объекты на каждой итерации цикла без ключевого слова «new». Есть ли способ сделать это?
По сути, я пытаюсь эмулировать поведение конструкции For-generate в VHDL.
Любая помощь или предложения с благодарностью.
Если вы не можете выделить память динамически, вам придется прибегнуть к переопределению operator new
а также new[]
использовать память из статически выделенного пула. Вам также придется реализовать operator delete
а также delete[]
также. Я бы сказал, что это довольно сложная задача, если у вас нет каких-либо требований к таким распределителям в целом.
У меня есть подозрение, что вам может быть лучше забыть о странных подмножествах C ++ в качестве средства генерации аппаратного обеспечения и просто написать то, что вы хотите, в VHDL, который, будучи языком описания аппаратного обеспечения, имеет инструменты для работы.
В то время как VHDL поддерживает new
для моделирования, естественно new
не может использоваться для синтеза, так как подразумевает динамическое распределение аппаратных ресурсов … не поддерживается ни одной из существующих в настоящее время цепочек инструментов ASIC или FPGA.
Итак, насколько я вижу, вы просто хотите массив из 488 объектов любого типа test
и работать на всех из них одновременно с test_func()
операция (что бы это ни было). Для которого вы, вероятно, хотите for ... generate
заявление.
Я не уверен, что это то, что вы ищете, но вы могли бы сделать что-то вроде этого:
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;
}
Вы можете иметь все объекты, предварительно выделенные и повторно используемые. Я имею в виду, предположим, вы знаете, что вам понадобится не более 10 объектов, живущих одновременно. Затем вы создаете 10 объектов и помещаете их в список неиспользуемых объектов.
Всякий раз, когда вам нужно «создать» объект, просто возьмите его из списка неиспользуемых объектов. Когда он вам больше не нужен, вы можете отправить его обратно в этот список.
Если вы знаете постоянный размер каждого объекта, вы можете просто выделить массив символов, а затем, когда вам нужен объект #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]);
}
если объект должен жить в контексте функции, вы можете использовать выделение стека (alloca) для его обработки. Распределение стеков должно поддерживаться в вашем подмножестве. Вы можете переопределить метод ‘new’, чтобы использовать эту функцию (или любую другую, доступную для работы со стеком).
Просто помните, как только вы выйдете из родительской функции, все будет уничтожено. Вам нужно будет проявить особую осторожность, чтобы вызвать деструктора, если это необходимо.