How does copy-on-modify operate on structs and classes?

23 views (last 30 days)
I understand that Matlab uses "copy-on-modify" so matrices, structs and class objects are only copied inside a function when the item passed in is modified.
Question: When matlab modifies a member of a struct or class in a function, is the entire struct or class object copied, or only the member which was modified?
Why is this important? Because if a struct or class has some very large matrices embedded, then a function which modifies a small part of the entire object would either copy/modify only the small part it works with (good!), or it might duplicate the entire object, even if it only works with a small piece (bad!).
A somewhat trivial example:
s.owner="charlie";
s.data=rand(10000,10000);
s=change_owner(s,"charlene");
. . .
function t = change_owner(t,new_owner);
t.owner = new_owner;
end
If change_owner(...) sees the entire object as modified, then it has to duplicate the nearly 1 GB data matrix, in order to change the owner field, which makes this function very inefficient. But if matlab recognizes that only the "owner" member is modified, then it can avoid duplicating the data matrix, and thus operate efficiently on the struct.
The same question obviously would apply to a class object as to a struct...

Accepted Answer

James Tursa
James Tursa on 29 Apr 2019
Edited: James Tursa on 29 Apr 2019
Question: When matlab modifies a member of a struct or class in a function, is the entire struct or class object copied, or only the member which was modified?
Only the member being modified is deep copied. The other members are typically reference copied only. E.g., in the following you can see that the data pointer value pr did not change ... i.e. the memory of the data field was not deep copied.
>> s.owner = 'charlie';
>> s.data = rand(1,5);
>> format debug
>> s.data
ans =
Structure address = 54747f90
m = 1
n = 5
pr = 11c661dc0
pi = 0
0.8147 0.9058 0.1270 0.9134 0.6324
>> s = change_owner(s,'charlene')
s =
owner: 'charlene'
data: [0.8147 0.9058 0.1270 0.9134 0.6324]
>> s.data
ans =
Structure address = 54747f90
m = 1
n = 5
pr = 11c661dc0
pi = 0
0.8147 0.9058 0.1270 0.9134 0.6324
  4 Comments
Bruno Luong
Bruno Luong on 30 Apr 2019
MATLAB stores interleave complex numbers starting from R2018b. So there is no longer Pi pointer.
Ian
Ian on 30 Apr 2019
Ah. Thnx.
I learn something new every day...

Sign in to comment.

More Answers (0)

Categories

Find more on Structures in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!