Question about different ways to declare objects and their effects on RAM usuage

I don't think anyone has actually answered your question yet, so here are my thoughts.

All three will work assuming you are not relying on the instance in consecutive calls to ds() being the same as each other or the same as the instance in setup()

Global objects: all memory is assigned on start-up and never freed.

Local function objects: memory for all three classes is assigned at the start of the method and freed at the end of the method.

Extra curly braces: this will assign the memory for each class and free it in turn.

If you want to see the order of things happening, I would add a constructor and destructor to each of your classes that outputs over the serial bus or something. The memory is assigned immediately before the constructor and freed immediately after the destructor.

Hope this helps.