C++ 就地 class 实例化

C++ in-place class instantiation

大量学习此(工作)代码

class MyClass {
public:
  double data[6];
  double func() const {
      return data[1] + 2*data[3];
  }
};

double takeMyClassReference(const MyClass &obj) {
    return obj.func();
}

void construct(const double y[]) {
    const MyClass *obj = reinterpret_cast<const MyClass *>(y);
    double val = takeMyClassReference(*obj);
    // do something with val
}

这段代码可以满足我的要求,而且效率很高,构造的开始被翻译成

movsd   24(%rdi), %xmm0
addsd   %xmm0, %xmm0
addsd   8(%rdi), %xmm0

效率最高。

是否有可能以更安全的方式编写此代码,无需 reinterpret_cast,但又不会牺牲速度?我无法更改 constructtakeMyClassReference 的签名。

唯一允许的方法是 std::memcpy:

void construct(const double y[]) {
    MyClass x;
    std::memcpy(&x,y,sizeof x);
    double val = takeMyClassReference(x);
    // do something with val
}

铿锵already optimizes this perfectly; 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
}