Delphi has always had three kind of coders:

  1. high-level coders, using components and RAD, standard library and its classes;
  2. low-level coders, using pure code SW development, looking at the asm code generated and tracking down memory and CPU usage;
  3. and to be honest, all low-level coders use the high-level tools, because for a simple form, RAD is great, and standard library is to be used anyway. 
In fact, the object type is one feature which low-level coders like a lot.
For example, the whole KOL library relies and it, and performs a great job with it. The XMLRad framework uses it a lot for all basic types, in order to increase speed, and improve multi-threaded server response time.

Here are some cases I use object for:
  1. a memory mapped file, which I want to parse very quickly: a pointer to such an object is just great, and you still have methods at hand; I use this for TFileHeader or TFileInfo which map the .zip header, in SynZip.pas;
  2. a Win32 structure, as defined by a API call, in which I put handy methods;
  3. a temporary structure defined on the stack, just used during a procedure: I use this for TZStream in SynZip.pas, or for our RTTI related classes, which map the Delphi generated RTTI in an Object-Oriented way not as the TypeInfo which is function/procedure oriented. By mapping the RTTI memory content directly, our code is faster than using the new RTTI classes created on the heap. We don't instanciate any memory, which, for an ORM framework like ours, is good for its speed. We need a lot of RTTI info, but we need it quick, we need it directly.
In fact, I discovered that new Delphi compiler doesn't like packed object.
I've an Internal Error DT5830 under Delphi 2009 Update 3, but previous compiler versions (including Delphi 2009 Update 2) did accept a packed object declaration.
There is a simple workaround: define it as packed record... this works, but is not compatible with previous version of the compiler.
So here is how such a packed object must be coded, if you want your code to work on most Delphi compiler versions:
{$A-} { force packed object (not allowed under Delphi 2009) }
/// the internal memory structure as expected by the ZLib library
TZStream = {$ifdef UNICODE}record{$else}object{$endif}
It's a pity that Embarcadero seems not to a have a full regression test of all compiler/language features, and run it before every release, like Free Pascal compiler does.
It's a pity that EMB changed the record type, by allowing adding methods on it. IMHO, it's exactly a no-feature. Noone asked for it, or for any good reason. If you want a "pure object pascal language", with no history, just created from scratch, with nice high-level features, just use PRISM.

So here is my today's claim:

Don't forget low-level Delphi coders! Save our object type!

Feedback and discussion is welcome on our forum.