comp.lang.ada
 help / color / mirror / Atom feed
From: "Warren W. Gay VE3WWG" <ve3wwg@NoSpam.cogeco.ca>
Subject: Re: Objects and the Stack?
Date: Sat, 18 Dec 2004 14:41:33 -0500
Date: 2004-12-18T14:41:33-05:00	[thread overview]
Message-ID: <PI%wd.637$Wt5.248352@read2.cgocable.net> (raw)
In-Reply-To: <32fv82F3l9al7U1@individual.net>

Nick Roberts wrote:
> Freejack wrote:
>> On Fri, 17 Dec 2004 00:28:23 +0000, Jeffrey Carter wrote:
>>> The fact that pointers are generally not needed in Ada except when 
>>> creating things such as dynamic data structures has nothing to do 
>>> with tagged types. If you create objects of a classwide type, they 
>>> are put on the stack if you declare them there, and in a storage pool 
>>> if you allocate them there.
...
> I suppose so, but I think I should tell you now that what you trying 
> (above) cannot work. The assumption in Ada is that the space reserved 
> within a stack frame for an object cannot be resized (even though the 
> space used /within/ the space reserved for an object can). So the 
> compiler must be able to allocate the maximum size of an object on the 
> stack. Since what you are attempting could cause Stack to grow to any 
> size without limit, the compiler cannot know what maximum to allocate. 
> It won't work, and so you must use the heap (or more correctly, a 
> 'storage pool').
> 
> Ada has no equivalent of alloca() in C. It might be interesting to 
> experiment with a compiler extension to provide this facility. Certain 
> algorithms might benefit from it.

The difference between what alloca() gets you and what you
get in the declare block is a minor difference:

    -- Pseudo Ada here (Ada-ised C code for alloca())
    declare
      My_String : String_Access := Alloca(String(1..8));
    begin
      ...
      Put_Line(My_String.all);

    -- Real Ada here
    declare
       My_String : String(1..8);
    begin
       ...
       Put_Line(My_String);

Apart from getting a pointer from alloca(), I don't see any
advantage. Both forms allocate from the stack frame.

>    declare
>       Name: String := "";
>       pragma Extensible_Object(Name);
>    begin
>       ...
>       Name := Name & ':'; -- changes its size
>       ...
> 
> It's an idea.

This is taking the alloca() idea further than I think it
goes. I could be wrong here, but can you realloc() an
alloca() region?  If so, that is something that Ada does
in fact lack (including a realloc() in general, which I
pine for when growing arrays).

Warren.



  parent reply	other threads:[~2004-12-18 19:41 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-16 22:27 Objects and the Stack? Freejack
2004-12-16 23:13 ` Nick Roberts
2004-12-20 14:50   ` Marc A. Criley
2004-12-20 16:22     ` Marius Amado Alves
2004-12-20 18:31       ` Dmitry A. Kazakov
2004-12-17  0:28 ` Jeffrey Carter
2004-12-17  8:45   ` Freejack
2004-12-17 11:11     ` Martin Dowie
2004-12-17 11:46     ` Nick Roberts
2004-12-17 19:52       ` Freejack
2004-12-18  4:02         ` Nick Roberts
2004-12-27  4:34         ` Dave Thompson
2004-12-18 19:41       ` Warren W. Gay VE3WWG [this message]
2004-12-18 20:50         ` Freejack
2004-12-18 21:15           ` Dmitry A. Kazakov
2004-12-27  4:34         ` Dave Thompson
2004-12-18  0:12     ` Jeffrey Carter
2004-12-18  0:43       ` Jeffrey Carter
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox