член класса распределяется между экземплярами экземпляра - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать класс с членом, совместно используемым некоторыми экземплярами (по копиям первого экземпляра), что-то вроде std::shared_ptr.

Член маленький (int), поэтому std::shared_ptrи выделение памяти выглядит как избыточное.

Дополнительные требования: должна быть возможность работать с необработанным значением и адресом, как с порядковым номером int.

Возможно ли это без std::shared_ptr?

1 Ответ

0 голосов
/ 26 июня 2019

Если вы не против некоторых бросков, и производительность определенно является проблемой, вы можете сделать что-то вроде этого:

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, безусловно, является более надежным способом решения этой проблемы, поэтому, если производительность не является критической проблемой или вы используете большие типы, пожалуйста, рассмотрите возможность ее использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...