One reader / one writer no-memory-allocation lock-free ring-buffer
there is absolutely no thread safety constructs, this means that you'll see a lot of interesting race conditions and memory inconsistencies 
just assuming dequeues happen fast enough does not mean they will in production
you return T by value in Obtain(), instead of by reference so you can't actually write into it
Obtain is a bad name, it sounds like it gets the next value like TryGet does
memcpy is a bad idea to use to store the values if there is ever a custom copy constructor and a destructor
that said Obtain->store->Commit can be put into a single Put(T*) member function
eventually curReadNum and curWriteNum will overflow, it's not a real problem here because your length is a power of 2 and they are unsigned