Note that this is only the case on 1.10.4, in 1.11.1 I also got 3 allocations for both sizes.
This doesn’t seem to be true in 1.11: resize! essentially just calls _deleteend!, which is implemented as
function _deleteend!(a::Vector, delta::Integer)
delta = Int(delta)
len = length(a)
0 <= delta <= len || throw(ArgumentError("_deleteend! requires delta in 0:length(a)"))
newlen = len - delta
for i in newlen+1:len
@inbounds _unsetindex!(a, i)
end
setfield!(a, :size, (newlen,))
return
end
(while in earlier versions it’s a ccall). So apart from changing the size attribute, it is also explicitly looping over all ‘deleted’ elements.