Мне нужно сделать тип POD, чтобы сохранить его с отображенным памятью файлом?

Указатели не могут быть сохранены непосредственно в файл, потому что они указывают на абсолютные адреса. Чтобы решить эту проблему, я написал Realiprapty_ptr шаблон , который содержит смещение вместо абсолютного адреса.

На основании того факта, что только тривиально копироваемые типы могут быть благополучно скопированы, я сделал предположение, что этот тип, необходимый для того, чтобы быть тривиально скопинным, который будет безопасно сохраняться в отображенном памяти файле и извлеките позже.

Это ограничение оказалось немного проблематичным, потому что созданный компилятор Copy Constructor не ведет себя значимым образом. Я ничего не нашел, что запрещаю мне по умолчанию конструктора копирования и сделать его частным, поэтому я сделал его частным, чтобы избежать случайных копий, которые приведут к неопределенному поведению.

Позже я нашел Boost :: Intercopess :: Offset_PTR , творение которого было обусловлено тем же потребностями. Однако оказывается, что Offset_ptr не является периодически скопинным, потому что он реализует свой собственный пользовательский конструктор копирования.

Является ли мое предположение о том, что умный указатель должен быть тривециально скопирован, чтобы быть сохраненным, безопасно неверно ошибаться?

Если такого ограничения, я задаюсь вопросом, могу ли я благополучно сделать следующее. Если нет, именно то, какие требования к тому, что тип должен соответствовать использованию в сценарии, который я описал выше?

struct base {
    int x;
    virtual void f() = 0;
    virtual ~base() {} // virtual members!
};

struct derived : virtual base {
    int x;
    void f() { std::cout << x; }
};

using namespace boost::interprocess;

void persist() {
    file_mapping file("blah");
    mapped_region region(file, read_write, 128, sizeof(derived));
    // create object on a memory-mapped file
    derived* d = new (region.get_address()) derived();
    d.x = 42;
    d->f();
    region.flush();
}

void retrieve() {
    file_mapping file("blah");
    mapped_region region(file, read_write, 128, sizeof(derived));
    derived* d = region.get_address();
    d->f();
}

int main() {
    persist();
    retrieve();
}

Благодаря всем те, которые предоставили альтернативы. Вряд ли я буду использовать что-то еще в ближайшее время, потому что, как я объяснил, у меня уже есть рабочее решение. И, как вы можете видеть из использования вопросительных знаков выше, мне действительно интересно знать, почему повышение может уйти без тривиально копированного типа, а как далеко вы можете пойти с ним: это совершенно очевидно, что классы с виртуальными членами не будут Работа, но Где вы рисуете линию?

15
задан R. Martinho Fernandes 5 September 2011 в 08:52
поделиться