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对象,并希望它深度复制数组。我的问题仍然存在。