Efficiency of using array as stack

Ivan Kazmenko gassa at mail.ru
Sat Mar 23 15:28:14 PDT 2013


On Saturday, 23 March 2013 at 12:37:04 UTC, bearophile wrote:

> Call assumeSafeAppend every time you want to append with no 
> reallocations.

Thank you for the suggestion!  This seems to work fast enough and 
never relocate:

-----
import core.memory;
import std.range;
import std.stdio;

void main ()
{
	version (NOGC) {GC.disable ();}
	int n = 1_000_000;
	auto s = array (iota (n));
	s.reserve (n * 2);
	foreach (i; 0..n)
	{
		assumeSafeAppend (s);
		debug {writefln ("before ++: %s %s", s.capacity, &s[0]);}
		s.length++;
		debug {writefln ("after ++: %s %s", s.capacity, &s[0]);}
		s.length--;
		debug {writefln ("after --: %s %s", s.capacity, &s[0]);}
	}
}
-----

Still, I am missing something here.  After assumeSafeAppend(s), 
the capacity of s is restored to the original value (in my case, 
2_000_891).  That means the memory manager keeps track of the 
original array (memory, not view) and knows its limits.  Can't 
it, or the compiler, also know there are no more writable views 
into that portion of memory and just optimize out the "capacity = 
0" part?  Does it lack such information, or is it hard to account 
for all possible scenarios?  Or is "capacity = 0" actually useful 
for some other concern?

-----
Ivan Kazmenko.


More information about the Digitalmars-d-learn mailing list