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,但又不会牺牲速度?我无法更改 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
}
铿锵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
}
大量学习此(工作)代码
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,但又不会牺牲速度?我无法更改 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
}
铿锵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
}