Usually SGObjects are stored in shared_ptr, so when we perform a copy we just increment the control block refcount. We have a clone method to perform deep cloning, but this means we might be copying features, labels and weights, which is not always needed. This can be avoided by passing the respective ParameterProperties to the make_clone function, so it would be good to have make_shallow_copy free function that sets these flags automatically (something like ParameterProperties::ALL ^ ParameterProperties::MODEL ^ ParameterProperties::READONLY), and then just have something like make_shallow_copy(obj).