No, prefix incrementation is read-modify-write. It must read that memory location into a register, than increment the register, then write that register back to memory. All volatile does is tell that compiler that that memory address might be written to by another process. It does not, and cannot, change the behavior of prefix increment.
Exactly two pointers of 'bloat'. Oh, also, it would make your constructor exception-safe.
The run time difference between a vector and a raw array is exactly nothing - unless, of course, you actually change it's size, in which case the vector will favor execution speed over memory usage.
The implementation time difference is, in this case, neglibible, as all you are doing is allocating and deleting it. Naturally, you wouldn't have to write a destructor at all if you used a vector. You certainly wasted time there.
You are using the algorithm described here
http://www.ddj.com/dept/cpp/189401457?pgno=3
The biggest problem is the fixed-sized buffer. If you fill it, you're sunk.
This option can be implemented using any linear standard container.
http://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html