By automatic I mean using a SaveGame object subclass and calling SaveDataToSlot or something like that. What this does is iterate all the UProperties in the SaveGame object and serialize them (if they differ from defaults).
All blueprint properties are UProperties, so if your SaveGame subclass is a blueprint class and your structs are blueprint structs, you don’t have anything to worry about.
From what you just said, I gather your SaveGame is a blueprint class, and contains struct properties that were declared natively. These structs forcibly have USTRUCT(…) otherwise they wouldn’t even be visible in blueprints. However if the properties within those structs are not prefixed with UPROPERTY, they will not be serialized by default, unless you provide a custom serialization method and inform the compiler via some obscure TStructOpsTypeTraitsBase2
shenanigans. I don’t know much about that but here’s some more info.
When you set struct variable = other struct variable, in c++ or blueprints, yes it does a full memory copy (or calls the copy operator if applicable). UProperties do not matter in this case. Serialization is different though as stated above.
Same rules apply. When assigning to variables or passing as function argument, “parent” struct would be fully copied as a single memory block, including embedded child structs. Of course that’s only true if they are actually embedded structs, not if they are pointers. Pointers would be copied as-is but whatever they point to is not copied.
As for serialization, embedded structs will be serialized if they are marked as UPROPERTY, and their properties will be serialized if they are also marked as UPROPERTY. Unless you provide custom serialization as mentioned above.