When you use a singleton, it is guaranteed that you cannot access the singleton before it is created. Hence getInstance().
I have only a handful of globals, all of which are totally independent of one another. A global logger, sometimes, a global resource cache (does nothing on construction) and rarely anything else. I've used the trick jyk showed before for managing the resource cache, in my newer code bases I simply don't make it global.
If you have globals and meaning real globals, not static functions...
We mean a value that is globally accessible (somehow).
...it is not guaranteed that global1 in compilation unit 1 is created before global2 in compilation unit 2 is accessing it.
At least to my knowledge of the c++ standard in this case. Also, a global always uses the memory it needs, a singleton only if it is used at all.
There are also potential multi-threaded issues with the delayed initialisation of global values. I tend not to worry about the memory usage, as the few globals I have are pretty much always used, unless the program shuts down because the configuration is completely corrupt.