我想创建一个类,其成员由某些实例(由第一个实例的副本)共享,例如std::shared_ptr
。
成员很小(int
),所以std::shared_ptr
和内存分配看起来像是过分杀了。
其他要求是:必须像序数int
一样使用原始值和地址。
如果没有std::shared_ptr
,这可能吗?
答案 0 :(得分:0)
如果您不反对某些类型的转换,并且性能绝对是一个问题,则可以执行以下操作:
class Object {
bool original; // True if "original" object, false if copy.
intptr_t value;
public:
Object(int val) : original(true), value(val) {}
Object(const Object& other) : original(false),
value(reinterpret_cast<intptr_t>(&other.value));
intptr_t getValue() const {
return original ? value : *reinterpret_cast<intptr_t*>(value);
}
};
避免动态分配,不占用大量内存,但是会进行一些指针强制转换,因此显然要小心。当然,这取决于intptr_t
的支持,这对于标准库的实现是可选的。
std :: shared_ptr绝对是解决此问题的更可靠的方法,因此,如果性能不是关键问题,或者您使用的是更大的类型,请考虑改用它。