Forbid dynamic arrays in boolean evaluation contexts
Steven Schveighoffer
schveiguy at yahoo.com
Tue Mar 26 20:26:59 PDT 2013
On Tue, 26 Mar 2013 23:21:35 -0400, deadalnix <deadalnix at gmail.com> wrote:
> On Tuesday, 26 March 2013 at 23:57:32 UTC, bearophile wrote:
>> Timon Gehr:
>>
>>> IOW, what is the point of "null" if you can just use [].
>>
>> I usually prefer to use [], because null is a literal for pointers and
>> class references, while [] is a literal specific for arrays (and
>> strings), so its meaning is more clear (in D I'd even like a [:]
>> literal that represents an empty associative array).
>>
>> On the other hand if you compile a program that uses null instead of []
>> you see some differences. In the current dmd compiler returning null is
>> more efficient. I have seen code where this difference in performance
>> matters:
>>
>>
>> int[] foo() {
>> return [];
>> }
>> int[] bar() {
>> return null;
>> }
>> void main() {}
>>
>>
>>
>> _D4temp3fooFZAi:
>> L0: push EAX
>> mov EAX,offset FLAT:_D11TypeInfo_Ai6__initZ
>> push 0
>> push EAX
>> call near ptr __d_arrayliteralTX
>> mov EDX,EAX
>> add ESP,8
>> pop ECX
>> xor EAX,EAX
>> ret
>>
>> _D4temp3barFZAi:
>> xor EAX,EAX
>> xor EDX,EDX
>> ret
>>
>> Bye,
>> bearophile
>
> That is a compiler bug isn't it ?
No. [] calls the hook for _d_arrayliteral, whose source is not known at
compile time. Runtime functions cannot be inlined, which will be set in
stone once the runtime is a dynamic library.
-Steve
More information about the Digitalmars-d
mailing list