[swift-users] Set size of byte array

Dave Abrahams dabrahams at apple.com
Mon Aug 8 12:29:47 CDT 2016


on Fri Aug 05 2016, KS Sreeram <swift-users-AT-swift.org> wrote:

>> On 05-Aug-2016, at 1:19 PM, Daniel Vollmer <lists at maven.de> wrote:
>> 
>> I’m by no means a Swift expert (not even a user at the moment), but I don't
>> see a way to do this either. The best that comes to mind is initializing a
>> ContiguousArray with the sufficient capacity as size, using
>> withUnsafeBufferPointer to overwrite elements, and then use replaceAll() with
>> an empty collection to remove the excess size.
>
> The only initializer that could help with this is:
> init(count:repeatedValue:). Unfortunately, this means the buffer is
> written to twice - once in the initializer, and a second time to
> actually fill in the data. It’s not efficient.
>
>> 
>> I'd think that just reserving enough capacity and then appending the elements
>> one-by-one will be (at least?) as efficient: The byte is always copied anyway,
>> and in this case you wouldn’t have to default-construct the capacity beforehand.
>
> This too isn’t efficient because each append call will incur an the
> cost of checking for sufficient capacity and also incrementing the
> size. The additional penalty could dwarf the cost of actually copying
> a byte! I don’t think the compiler is capable of removing this
> inefficiency.

Create a Sequence that represents the elements you're going to append,
e.g.:

  var a = [1, 2]
  a.reserve(256)
  a += sequence(first: 3, next: {$0 < 1000 ? ($0 + 3) * 2 : nil})

There are lots of ways to make Sequences, but the overloaded sequence()
functions are probably the easiest.

HTH,

-- 
-Dave



More information about the swift-users mailing list