C++ 如何用数组初始化struct?
使用数组初始化结构是否有比执行以下操作更好的方法C++ 如何用数组初始化struct?,c++,arrays,pointers,struct,initialization,C++,Arrays,Pointers,Struct,Initialization,使用数组初始化结构是否有比执行以下操作更好的方法 struct Parameters { double distance; double radius; double strength; long distanceX; long distanceY; long clickX; long clickY; }; void calculate(double dParameters[], long lParameters[]) { Par
struct Parameters
{
double distance;
double radius;
double strength;
long distanceX;
long distanceY;
long clickX;
long clickY;
};
void calculate(double dParameters[], long lParameters[])
{
Parameters param =
{
dParameters[0],
dParameters[1],
dParameters[2],
lParameters[0],
lParameters[1],
lParameters[2],
lParameters[3]
};
}
我想分配指针:
void calculate(double dParameters[], long lParameters[])
{
Parameters param;
(double*)(¶m.distance) = &dParameters[0];
(long*)(¶m.distanceX) = &lParameters[0];
}
但是我不确定它是否在C++中是有效的.< /p> 你的第二个例子是非法的,但是很可能优化器(知道实际的布局)确实实现了它。
如果你知道结构的布局,并且仔细地选择将所有类型的成员放在它们之间而没有任何东西,那么你可以使用<代码> MycPy.() 这是一段相当脆弱的代码,因为distance
必须是一行中正好四个双参数中的第一个双参数,否则您将得到损坏的数据,并且在编译时不会验证这一点
可以使用offset of对其进行改进,以获取和/或验证长度。例如:
void calculate(double dParameters[], size_t n_dParameters, long lParameters[], size_t n_lParameters)
{
Parameters param;
assert(offsetof(Parameters, strength) - offsetof(Parameters, distance) == sizeof(*dParameters) * n_dParameters);
memcpy(¶m.distance, dParameters, offsetof(Parameters, strength) - offsetof(Parameters, distance));
assert(offsetof(Parameters, clickY) - offsetof(Parameters, distanceX) == sizeof(*lParameters) * n_lParameters);
memcpy(¶m.distanceX, dParameters, offsetof(Parameters, clickY) - offsetof(Parameters, distanceX));
}
从历史上看,gcc在优化结构初始化方面并不擅长,例如在可能且有益的情况下使用等价的memcpy()
或memset()
。如果您的结构有100个字段,这实际上可能很有用
另一种技术是使用联合定义结构的数组版本和单个字段版本
struct ParametersArrays {
double doubles[3];
long longs[4];
};
union ParametersUnion {
struct Parameters params;
struct ParametersArrays arrays;
};
ParametersUnion u;
memcpy(u.arrays.doubles, dParameters, sizeof(u.arrays.doubles));
memcpy(u.arrays.longs, lParameters, sizeof(u.arrays.longs));
Parameters& p = u.params; // Now you can use p
注意,使用这样的一个以上成员的成员在C++中不是严格合法的,但它是在C中,并且大多数/所有C++编译器都会按预期编译它。
您有<代码>结构> <代码>。它包含您需要的所有值。因此,创建一个struct数组来保存所需的所有struct实例,并将struct数组(例如,指向数组中第一个struct的指针)作为参数传递,然后使用函数中的所有值处理该数组。struct ParametersArrays {
double doubles[3];
long longs[4];
};
union ParametersUnion {
struct Parameters params;
struct ParametersArrays arrays;
};
ParametersUnion u;
memcpy(u.arrays.doubles, dParameters, sizeof(u.arrays.doubles));
memcpy(u.arrays.longs, lParameters, sizeof(u.arrays.longs));
Parameters& p = u.params; // Now you can use p