实例副本之间共享的类成员

时间:2019-06-25 21:34:50

标签: c++ c++11

我想创建一个类,其成员由某些实例(由第一个实例的副本)共享,例如std::shared_ptr

成员很小(int),所以std::shared_ptr和内存分配看起来像是过分杀了。

其他要求是:必须像序数int一样使用原始值和地址。

如果没有std::shared_ptr,这可能吗?

1 个答案:

答案 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绝对是解决此问题的更可靠的方法,因此,如果性能不是关键问题,或者您使用的是更大的类型,请考虑改用它。