On 17/02/2014 16:40, Jürgen Hestermann wrote:

But changing the size it is a modification! When an array can be resized then the resizing means that I have to write to it (in contrast to reading, where no data is modified). I am astonished that everybody here seems not to see this. Maybe because they already got so accustomed to the behaviour that now far-fetched explanations are fabricated to make the documentation look right in some sense only because it *has* to be right (like a dogma).

In the question really, if the documentation is right? The documentation (if right) expresses the expected behaviour that the person who designed the function had intended.

It appears, that the copy-on-setlength is intended. So in that the documentation is right.

As for this being a good or bad idea, is a different question. (There are pro and con apparently). But even if we concluded it bad, changing it now would be by far worse.

Besides I believe it is not possible

setlength(a,10)
b := a;
setlength(a,1200)

The data pointed to by both a and b (before the final setlength) has a refcount of 2. But it has no info where a and b are. So in SetLength(a, 1200) it is unknown where the other reference (b) is. And that means b can not follow this change.

Other theoretical solutions would be:
- do not allow setlength, if refcount > 1
- do another level of pointer/referencing
- do a full COW

None of those appeal to me.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to