Array initialization quiz
Ali Çehreli
acehreli at yahoo.com
Wed Nov 30 12:56:01 PST 2011
On 11/30/2011 10:17 AM, Xinok wrote:
> On 11/30/2011 11:46 AM, Steven Schveighoffer wrote:
>>
>> foreach(_i; ubyte.min..ubyte.max + 1){
>> ubyte i = cast(ubyte)_i;
>> }
>>
>> But my point was, foreach over a range gives me all the elements in a
>> range, regardless of how the underlying loop is constructed. The
>> limitation by the compiler is artificial.
>>
>> I remember at one point there was someone who had actual code that
>> resulted in a loop for ubytes, or was trying to figure out how to
>> foreach over all possible ubyte values.
>>
>> -Steve
>
> It shouldn't be. The compiler should be smart enough to inline the
> function and optimize the typecast to something like this:
>
> void main(string[] args){
> foreach(_i; ubyte.min .. ubyte.max + 1)
> writeln(*cast(ubyte*)&_i);
> }
>
> This would actually be faster since you don't have to iterate two
> variables.
But variables may be implemented on CPU registers and be fast. That is
easy to do with Steven's code and cast above. In your code, taking the
address of _i would put _i in memory. (Unless the compiler has an
optimization for that. Too lazy to check. :()
Also, *cast(ubyte*)&_i works only on little endian systems, right? But
you meant that the compiler should take care of endianness as well.
Ali
More information about the Digitalmars-d-learn
mailing list