This is a discussion I had with Ryan many times... It's even a close to official topic:
https://github.com/IndustryFoundationCl ... s/issues/3
It is not simple, because quickly you find that such cases are billions. Ex: a profile is made from a rectangle, which is extruded, which becomes the representation of a column. There are 4 possible levels of "sharing" between two identical columns: the representation, the extrusion, the profile or the rectangle. What if a totally different object uses the same rectangle, etc..
These things are all possible in IFC. But it's very rare to see applications that use it, it's a shoot in the dark to know what they will do if they encounter such thing.
And there is the "usual" way, that most apps do, that is done in FreeCAD too at the moment: if you have two columns that are clones of each other in FreeCAD, only one representation is created, and both columns use it as an IfcMappedItem . But I agree we should be able to do much better than that..
Have a look at the IfcOpenHouse example that comes with IfcOpenShell, there are some bold experiments there, like reusing a single roof pane twice, manipulating copies of walls, etc. And it seems to work quite well.
I have started to implement a system, in the IFC exporter, which is a "recycler" system (ifcbin), each time a 3D point is created, or a polyline, etc... (several types are supported), at the same time it is created, it is "registered", so if another identical entity needs to be created, the registered one is used instead, which already reduces file sizes a great deal. Maybe that system can be extended much further...
Only, as far as I tested, most apps that read those files recreate many separate entities just the same. So it has impact on the IFC file size, but not really on how objects get constructed at the other end. So far only using IfcMappedItems seems to work (but still fails to recreate proper families in revit, for ex).