Simple Pool Allocator
Allocation of raw memory
Rather than using operator new you could use std::get_temporary_buffer&lt;T&gt;(n). This allocates contiguous &quot;correctly aligned&quot; storage for enough memory to store approx n objects of type T (its non binding contract read documents).
Constructor
It may be more efficient to use normal constructor than the copy constructor. You should also provide the move constructor.
T* operator()(T&amp;&amp; x);
T* operator()(T const &amp;x);
template&lt;typename... Args&gt;
T* operator()(Args... args);

Destructor
Yes you can optimize the destructor if Ts destructor is guranteed to do nothing.
template&lt;typename T&gt;
struct SimpleDestructableTrivialy
{
    static constexpr bool value = std::is_trivially_destructible&lt;T&gt;::value;
};
template&lt;typename T, bool = SimpleDestructableTrivialy&lt;T&gt;::value&gt;
class SimpleDestroy
{
    public:
        void destroyElements(T* p, std::size_t T_per_page);
};
template&lt;typename T&gt;
class SimpleDestroy&lt;T, true&gt;
{
    public:
        void destroyElements(T* p, std::size_t T_per_page) {}
};
template&lt;typename T&gt;
class SimpleDestroy&lt;T, false&gt;
{
    public:
        void destroyElements(T* p, std::size_t T_per_page)
        {
            for (size_t pos = T_per_page; pos &gt; 0; --pos)
                p[pos - 1].~T();
        }
};