On Thursday, 2 June 2022 at 08:14:40 UTC, Mike Parker wrote:
You've initialized `str` with a string literal. No memory is allocated for these from the GC. They're stored in the binary, meaning they're loaded into memory from disk by the OS. So `str.ptr` points to a static memory location that's a fixed size, hence no extra capacity.

I didn't know that, so maybe this example proves it; the following test code that Ali has started and I have developed:

```d
import std.range;
import std.stdio;

/* toggle array:

alias chr = char*;
auto data = [' '];/*/

alias chr = immutable(char*);
auto data = " ";//*/

void main()
{
  chr[] ptrs;
  data.fill(3, ptrs);

  writeln;
  foreach(ref ptr; ptrs)
  {
    " 0x".write(ptr);
  }
} /* Print Out:

 0:           0 1:          15 2:          31 3:          47
 0x55B07E227020 0x7F2391F9F000 0x7F2391FA0000 0x7F2391FA1000
//*/


void fill(R)(ref R mostRecent,
             int limit,
             ref chr[] ptrs)
{
  auto ptr = mostRecent.ptr;
  size_t capacity, depth;

  while (depth <= limit)
  {
    mostRecent ~= ElementType!R.init;

    if(ptr != mostRecent.ptr)
    {
      ptrs ~= ptr;
      depth.writef!"%2s: %11s"(capacity);
      depth++;
    }

    if (mostRecent.capacity != capacity)
    {
      ptr = mostRecent.ptr;
      capacity = mostRecent.capacity;
    }
  }
}
```

As for the result I got from this code: The array configured in the heap is copied to another memory region as soon as its capacity changes (0x5...20 >> 0x7...00). We get the same result in array. Just add the / character to the beginning of the 4th line to try it.

Thank you all very much for the replies; all of these open my mind.

SDB@79

Reply via email to