переход с calloc () на новый

Я наткнулся на большую структуру pod, в которую я хотел добавить std::vector член.

struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
...            // dozens of primitive types
std::vector<int> the_new_vector;
};

Для того, чтобы добавить vector к этой структуре, мне нужно было заменить все calloc() экземпляры этой структуры с new,

Кроме того, мне нужно создать экземпляр каждого существующего члена в ноль.
Тем не менее, добавление конструктора по умолчанию, который создает каждый элемент в ноль, является обычной задачей. Также легко забыть создать экземпляр нового участника в будущем.

LargePodStruct::LargePodStruct()
x(), y(), z(), arr(), sz(), ... // +dozens of instantiations
{}
  1. Есть ли более простой способ создания экземпляров примитивных членов этой структуры с меньшими усилиями?

  2. Есть хороший & элегантный способ обнуления члена профсоюза?

.

struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
...
union {
int i;
void *ptr;
} u;
std::vector<int> the_new_vector;
};

0

Решение

Вы мог продолжать выделять необработанный блок памяти, используя calloc(), а затем использовать Размещение новый построить структуру внутри этого блока памяти:

void *buffer = calloc(1, sizeof(LargePodStruct));
LargePodStruct *s = new(buffer) LargePodStruct;

Однако вы не сможете использовать delete чтобы освободить структуру, вы должны вызвать ее деструктор напрямую, а затем free() блок памяти:

s->~LargePodStruct();
free(buffer);
2

Другие решения

template<typename V>
struct zdf{
V value;
zdf():value{}{};
operator V&(){return value;};
operator V()const{return value;};
V operator()const{return value;};
V& operator(){return value};
};

struct LargeModernValue{
zdf<float> x,y,z;
std::vector<int> arr;
std::any u;/*std::variant<int,void*> u;*/
//....
std::vector<int> theNewVec;
};
1