Пользовательский распределитель без арифметики указателя - PullRequest
0 голосов
/ 04 мая 2018

У меня есть собственный класс распределителя, который выглядит примерно так:

class allocator {
private:
  char* memory;
  std::ptrdiff_t offset;
  std::size_t total_size;

public:
  allocator(std::size_t size) : total_size(size), offset(0) {
    memory = new char[size];
  }
  void* allocate(std::size_t size, std::size_t alignment) {
    // unimportant stuff

    void* current_address = &start_ptr[offset]; // --> OUCH, pointer arithmethic

    offset += size;
    // unimportant stuff
    return current_address;
  }

}

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

Я думал о том, чтобы, возможно, использовать std::vector<char>, поскольку он содержит непрерывный блок памяти, и делать что-то вроде этого:

std::vector<char> memory;

void* current_address = &(memory.at(offset));

Но мне это не кажется приятнее. У вас есть какие-либо идеи о том, как безопасно управлять пулом памяти безопасным способом?

1 Ответ

0 голосов
/ 19 марта 2019

Цитирую комментарий YSC, чтобы ответить на этот вопрос:

Они препятствуют арифметике указателей для «стандартных» операций. Работа с неинициализированным выделением памяти нет. ИМО, арифметика указателей в функции выделения распределителя прекрасно, если его просто читать.

...