Код: Выделить всё
void*
Если из этого кода неясна его функциональность, просмотрите пример сборщика памяти.
Код: Выделить всё
#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