Задать вопрос
solaris
@solaris

Существует ли STL обертка для непрерывной области памяти (raw memory buffer)?

Есть вот такой велосипед:

#include <memory>
#include <iostream>

class memory_block {
 public:
  memory_block(std::size_t size) {
    init(size);
  };

  memory_block(const memory_block &src) {
    *this = src;
  };

  memory_block& operator=(const memory_block &src) {
    init(src.real_size_);
    std::copy(src.start(), src.end(), start());
    return *this;
  };

  ~memory_block() {
    clear();
  };

  char* start() const {
    return internal_ptr_.first;
  };

  char* end() const {
    return internal_ptr_.first + internal_ptr_.second;
  };

 private:
  void clear() {
    std::return_temporary_buffer(internal_ptr_.first);
  };

  void init(std::size_t size) {
    if (size > real_size_) {
      clear();
      real_size_ = size;
    }
    this->internal_ptr_ = std::get_temporary_buffer<char>(size);
  };

  std::pair<char*, std::ptrdiff_t> internal_ptr_;
  size_t real_size_;
};

int main(int argc, char *argv[]) {
  char test_str[] = "123456789";
  memory_block b1(10);
  std::copy(test_str, test_str + 10, b1.start());
  memory_block b2(b1);
  memory_block b3(0);
  memory_block b4(0);
  b3 = b1;
  std::cout << b1.start() << std::endl; // "123456789"
  std::cout << b2.start() << std::endl; // "123456789"
  std::cout << b3.start() << std::endl; // "123456789"
  std::cout << std::boolalpha;
  std::cout << (b4.start() == NULL) << std::endl; // true
  std::cout << (b4.end() == NULL) << std::endl; // true
  return 0;
}


Есть ли стандартные плюшки, позволяющие его выкинуть из проекта? Есть одно неприятное «но» — компилятор, C++ Builder5. Я нагуглил boost::asio::buffer, но к сожалению, boost с этим чудо-билдером не работает. В STL ничего подобного не нашел. Есть вариант использовать std::vector, который якобы гарантирует непрерывность, но мне это кажется хаком пострашнее нынешнего. Может, я проглядел что-то?
  • Вопрос задан
  • 3527 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
ixSci
@ixSci
Да, вы проглядели:
Во-первых:
который якобы гарантирует непрерывность

не якобы, а гарантирует.
Во-первых: Это не является никаким хаком, а является нормальным использованием динамичски расширяемого буфера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы