C++ C++;就地类实例化
在这个(工作)代码上花很多时间 这是最有效的C++ C++;就地类实例化,c++,class,constructor,initialization,instantiation,C++,Class,Constructor,Initialization,Instantiation,在这个(工作)代码上花很多时间 这是最有效的 有没有可能以一种更安全的方式写这篇文章,不需要重新解释,但不牺牲速度?我无法更改construct或takeMyClassReference的签名。唯一允许的方法是使用std::memcpy: void construct(const double y[]) { MyClass x; std::memcpy(&x,y,sizeof x); double val = takeMyClassReference(x);
有没有可能以一种更安全的方式写这篇文章,不需要重新解释,但不牺牲速度?我无法更改
construct
或takeMyClassReference
的签名。唯一允许的方法是使用std::memcpy
:
void construct(const double y[]) {
MyClass x;
std::memcpy(&x,y,sizeof x);
double val = takeMyClassReference(x);
// do something with val
}
叮当声;ICC很接近(但忽略了使用加法的强度降低),而GCC生成无用的堆栈存储(奇怪的是,包括一个在数学之后的堆栈存储)。唯一允许的方法是使用
std::memcpy
:
void construct(const double y[]) {
MyClass x;
std::memcpy(&x,y,sizeof x);
double val = takeMyClassReference(x);
// do something with val
}
叮当声;ICC很接近(但忽略了使用加法的强度降低),而GCC生成了无用的堆栈存储(奇怪的是,包括数学之后的堆栈存储)。如果您愿意从拥有数据的MyClass转移到不拥有数据的MyClass
class MyClass {
public:
double *data;
double func() const {
return data[1] + 2*data[3];
}
};
void construct(double y[]) {
MyClass obj;
obj.data = y;
double val = takeMyClassReference(obj);
// do something with val
}
如果您愿意从拥有数据的MyClass转移到不拥有数据的MyClass
class MyClass {
public:
double *data;
double func() const {
return data[1] + 2*data[3];
}
};
void construct(double y[]) {
MyClass obj;
obj.data = y;
double val = takeMyClassReference(obj);
// do something with val
}
出于好奇,为什么一个双重身份的人不能
std::uintpttr\u t
?它不会改变函数体,但数组类型更有意义。因为双精度浮点数不是指针?为什么不让MyClass
为构造函数而不是成员数组取一个double*data
参数?我希望MyClass对象拥有数据,因为在代码中的不同位置,我复制了一个MyClass对象,并希望它深度复制数组。我的问题仍然存在。出于好奇,为什么一个双精度的不std::uintpttr\u t
?它不会改变函数体,但数组类型更有意义。因为双精度浮点数不是指针?为什么不让MyClass
为构造函数而不是成员数组取一个double*data
参数?我希望MyClass对象拥有数据,因为在代码中的不同位置,我复制了一个MyClass对象,并希望它深度复制数组。我的问题仍然存在。