从 calloc() 迁移到 new
migrating from calloc() to new
我遇到了一个大型 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
{}
有没有更简单的方法来实例化这个结构的原始成员,更省力?
是否也有一种很好且优雅的方法来零实例化联合成员?
.
struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
...
union {
int i;
void *ptr;
} u;
std::vector<int> the_new_vector;
};
您可以继续使用calloc()
分配原始内存块,然后使用placement-new在该内存块中构造结构:
void *buffer = calloc(1, sizeof(LargePodStruct));
LargePodStruct *s = new(buffer) LargePodStruct;
但是,您将无法使用delete
释放结构,您必须直接调用其析构函数,然后free()
内存块:
s->~LargePodStruct();
free(buffer);
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;
};
我遇到了一个大型 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
{}
有没有更简单的方法来实例化这个结构的原始成员,更省力?
是否也有一种很好且优雅的方法来零实例化联合成员?
.
struct LargePodStruct {
float x,y,z;
int *arr;
int sz;
...
union {
int i;
void *ptr;
} u;
std::vector<int> the_new_vector;
};
您可以继续使用calloc()
分配原始内存块,然后使用placement-new在该内存块中构造结构:
void *buffer = calloc(1, sizeof(LargePodStruct));
LargePodStruct *s = new(buffer) LargePodStruct;
但是,您将无法使用delete
释放结构,您必须直接调用其析构函数,然后free()
内存块:
s->~LargePodStruct();
free(buffer);
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;
};