From: Olivier Scalbert <olivier.scalbert@algosyn.com>
Subject: Re: Allocation question
Date: Mon, 11 May 2009 14:14:03 +0200
Date: 2009-05-11T14:14:03+02:00 [thread overview]
Message-ID: <4a081676$0$2850$ba620e4c@news.skynet.be> (raw)
In-Reply-To: <54897f26-0d3f-421e-9426-1822a531674e@p4g2000vba.googlegroups.com>
Ludovic Brenta wrote:
> Yes. Your image is on the stack. You can increase the size of the
> stack up to an operating-system-dependent maximum (see ulimit(1) on
> Unix-like systems) but there is always a limit. For potentially very
> large objects, I think the better approach is to allocate them on the
> heap. I would suggest you hide the allocation and deallocation inside
> a controlled object which you declare on the stack, e.g.
>
> private with Ada.Finalization;
> package Image is
> type Image_T (Width, Height : Natural := 0) is private;
> private
> type Data_T is array(Positive range <>, Positive range <>) of
> Color_T;
> type Data_Access_T is access Data_T;
> type Image_T (Width, Height : Natural) is
> new Ada.Finalization.Controlled with record
> Data : Data_Access_T;
> end record;
> overriding procedure Initialize (Object : in out Image_T); --
> allocates
> overriding procedure Adjust(Object : in out Image_T); -- duplicates
> Data.all?
> overriding procedure Finalize(Object : in out Image_T); --
> deallocates
> end Image;
>
> with Image;
> declare
> Im1 : Image.Image_T (1 .. 1024, 1 .. 1024); -- calls Initialize
> which allocates
> Im2 : Image.Image_T (0, 0); -- calls Initialize which does nothing
> begin
> Im2 := Im1; -- calls Finalize (Im2) then Adjust (Im2)
> end; -- calls Finalize for both
>
> You may also share image data between objects.
>
> For even larger objects you can make Initialize, Adjust and Finalize
> much more sophisticated and store parts of the object on the heap and
> part on disk. You would do that only if you think you can beat the
> performance of your kernel's paging subsystem.
>
> HTH
>
> --
> Ludovic Brenta.
Thanks Ludovic.
procedure Initialize (Object : in out Image_T) is
begin
Ada.Text_IO.Put("Initialize");
-- What shall I put here ?
end Initialize;
Olivier.
next prev parent reply other threads:[~2009-05-11 12:14 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-11 10:23 Allocation question Olivier Scalbert
2009-05-11 10:38 ` Georg Bauhaus
2009-05-11 10:40 ` Ludovic Brenta
2009-05-11 12:14 ` Olivier Scalbert [this message]
2009-05-11 12:18 ` Ludovic Brenta
2009-05-11 13:01 ` Olivier Scalbert
2009-05-11 12:26 ` Jacob Sparre Andersen
2009-05-11 13:27 ` Ludovic Brenta
2009-05-11 10:51 ` Use aggregates (Was: Allocation question) Jacob Sparre Andersen
2009-05-11 11:46 ` Olivier Scalbert
2009-05-11 12:16 ` Ludovic Brenta
2009-05-11 21:26 ` sjw
2009-05-12 5:58 ` GNAT, aggregates and efficiency (Was: Use aggregates) Jacob Sparre Andersen
2009-05-12 18:57 ` sjw
2009-05-12 7:47 ` Use aggregates (Was: Allocation question) Martin
2009-05-12 10:24 ` Brian Drummond
2009-05-12 11:07 ` Georg Bauhaus
2009-05-12 11:14 ` Georg Bauhaus
2009-05-12 21:18 ` Randy Brukardt
2009-05-13 16:38 ` Martin
2009-05-13 20:38 ` Randy Brukardt
2009-05-14 10:48 ` Martin
2009-05-12 9:13 ` Emacs Stephen Leake
2009-05-12 9:38 ` Emacs Ludovic Brenta
2009-05-12 9:46 ` Emacs Olivier Scalbert
2009-05-11 10:57 ` Allocation question Philipp Riegger
2009-05-11 12:18 ` Georg Bauhaus
2009-05-11 12:36 ` Philipp Riegger
2009-05-11 23:32 ` Brian Drummond
2009-05-12 1:09 ` tmoran
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox