When you define your own GObject class, you have to define 2 casts macro (instance cast and class cast). So you write :
#define MY_TYPE (My_Type_get_type())
#define MY_TYPE(inst) (G_TYPE_CHECK_INSTANCE_CAST((inst), MY_TYPE, My_Type))
e.g :
#define GTK_TYPE_LABEL (gtk_label_get_type ())
#define GTK_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_LABEL, GtkLabel))
Now have a look at My_Type_get_type() declaration and definition. My_Type_get_type() always return the same GType. So if you write multiple cast, only one call to My_Type_get_type() is really necessary. But gcc is a good servant and does what you ask him : calls My_Type_get_type() whenever you call it. Think about this kind of loop :
for( ... ) {
GtkWidget* widget= ...;
gtk_box_pack_start(GTK_BOX(hbox), widget, ...);
}
To avoid such a waste, you have to tell gcc that all calls to My_Type_get_type() return the same GType.
GType My_Type_get_type (void) G_GNUC_CONST;
e.g:
GType gtk_label_get_type (void) G_GNUC_CONST;
Yes, it's that simple. Just add a G_GNUC_CONST attribute, and gcc will optimize all your to My_Type_get_type(), therefore all your MY_TYPE(inst).
Be smart, don't forget G_GNUC_CONST when you create your GObject class :)
Of course, glib and gtk+ already do this kind of optimization.