Может ли void* быть разумным (лучше) в функциях, работающих с необработанной памятью разных размеров? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Может ли void* быть разумным (лучше) в функциях, работающих с необработанной памятью разных размеров? [закрыто]

Сообщение Anonymous »

в C++ часто обвиняют в путанице в системе типов. Я написал класс, который хранит необработанную память (количество управляемых байтов обычно известно). Он собирает память как стек.
Если из этого кода неясна его функциональность, просмотрите пример сборщика памяти.

Код: Выделить всё

#include 

class memory_collector {

struct frame {
frame* next;
};

private:
frame* head_;

public:
memory_collector() : head_(nullptr) {}
~memory_collector() = default;

public:
// it implements stack push
template 
requires(std::is_pointer_v)
void push(P p) noexcept {
head_ = new(p) frame{head_};
}

// it implements stack pop (+ ret)
auto pop() noexcept {
frame* p = head_;
head_ = head_->next;
return reinterpret_cast(p);
}
};
Пример

Код: Выделить всё

#include 

int main() {
memory_collector m;

m.push(new std::tuple);
m.push(new std::tuple);
m.push(new std::tuple);

delete reinterpret_cast       (m.pop());  // delete std::tuple
delete reinterpret_cast(m.pop());  // delete std::tuple
delete reinterpret_cast    (m.pop());  // delete std::tuple
}
Мне не очень нравится код методов, потому что:
  • пользователь в 99% случаев будет переинтерпретировать_cast возвращенный указатель из pop()
  • причина усложнять функцию push() параметром шаблона и предложением require неясна
Я пытался переписать свой код.

Код: Выделить всё

void push(void* p) noexcept {
ptr = new(p) frame{ptr};
}

void* pop() noexcept {
auto p = ptr;
ptr = ptr->next;
return static_cast(p);
}
Вопрос
Какие проблемы с производительностью вызывает void* в моем коде?
Примечание.

[*]Память в указателе p, передаваемом в push(), должна быть необработанной (мусорной).

Пользователь каким-то образом знает размеры памяти для всех указателей, возвращаемых функцией pop().



Подробнее здесь: https://stackoverflow.com/questions/784 ... f-differen
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»