D newb
Steven Schveighoffer
schveiguy at yahoo.com
Tue Aug 19 04:08:56 PDT 2008
"JAnderson" wrote
> bearophile wrote:
>> Joel Anderson:
>>>> bearophile:
>>>>> My question: does the compiler raise a compilation error if the
>>>>> 'scope' keyword is used where the compiler can't actually allocate the
>>>>> class on the stack? (if not, then I think it may be better for the
>>>>> compiler to raise such error, avoiding the illusion of efficiency).
>>> If the class has a component sub-class the component may be heap
>>> allocated. I don't agree with making that an error though.
>>
>> May I ask you why you don't like that as an error?
>> Generally I don't like undefined situations, if I add the 'scope' keyword
>> I want the class to be stack-allocated, and I assume the compiler does
>> that. Then the layout of the memory used by the code is different, and I
>> can for example take care to avoid a stack overflow. If the compiler at
>> compile time is able to tell me that the class can't be allocated on the
>> stack, then I think the program has to not compile until I remove the
>> 'scope' keyword there. This makes the code reflect what the program
>> actually does.
>>
>> Bye,
>> bearophile
>
> What I'm talking about is:
>
> class A
> {
>
>
> }
>
> class B
> {
> ...
> A a = new A(); // Heap Allocated
> ...
> };
>
>
> ...
>
> scope B b = new B; //B is scope allocated but A is not
>
> Say your using someone else's class. You get latest and you using one of
> there classes with the word scope. They've decided to add something that
> is heap allocated. Now suddenly your code is not working because someone
> made a slight change to their interface.
>
The compiler cannot know when a constructor will decide to heap-allocate.
So it cannot predict whether the entire class will be stack-allocated. Once
the constructor is called, you cannot extend the previous stack frame
(without a lot of extra work), and even then, it cannot be sure that the
calling function won't use that stack space later in the function. I think
what you ask for is impossible to implement, and impossible to detect.
-Steve
More information about the Digitalmars-d
mailing list