On Tue, 05 Oct 2010 09:00:13 -0400, Bob Cowdery <bob@bobcowdery.plus.com> wrote:
> On 05/10/2010 13:45, Denis Koroskin wrote:
>> "static this" is called a static constructor and can be used for
>> classes and modules. The code in static constructor is guarantied to
>> be called before you use that class/module, it usually happens upon
>> thread initialization.
>>>> The other solution is better though:
>>>> enum A_RX_FILT = [ // just works
>> "6K0": tuple(100.0, 6100.0),
>> "2K4": tuple(300.0, 2700.0),
>> "2K1": tuple(300.0, 2400.0),
>> "1K0": tuple(300.0, 1300.0),
>> "500": tuple(500.0, 1000.0),
>> "250": tuple(600.0, 850.0),
>> "100": tuple(700.0, 800.0)
>> ];
> I'm not totally understanding that. Why can enum compute that at compile
> time and the thing which it is, an associative array cannot. Is it to do
> with where these things live.
I'd be very wary of this solution. Recently, enum has been shown to construct itself on every use.
So what I think is happening is every time you use A_RX_FILT, it's building a brand new AA (you can verify this by looking at the disassembly).
I'd recommend the static this solution in order to ensure you are not accidentally killing performance by just using that AA.
A while back, Don suggested that all literals should be considered immutable. I agree with him, but Walter still doesn't. If all literals are immutable, then they could be truly constructed at compile-time.
-Steve

On 05/10/2010 15:14, Steven Schveighoffer wrote:
> On Tue, 05 Oct 2010 09:00:13 -0400, Bob Cowdery <bob@bobcowdery.plus.com> wrote:
>>> On 05/10/2010 13:45, Denis Koroskin wrote:
>>>> "static this" is called a static constructor and can be used for classes and modules. The code in static constructor is guarantied to be called before you use that class/module, it usually happens upon thread initialization.
>>>>>> The other solution is better though:
>>>>>> enum A_RX_FILT = [ // just works
>>> "6K0": tuple(100.0, 6100.0),
>>> "2K4": tuple(300.0, 2700.0),
>>> "2K1": tuple(300.0, 2400.0),
>>> "1K0": tuple(300.0, 1300.0),
>>> "500": tuple(500.0, 1000.0),
>>> "250": tuple(600.0, 850.0),
>>> "100": tuple(700.0, 800.0)
>>> ];
>> I'm not totally understanding that. Why can enum compute that at compile time and the thing which it is, an associative array cannot. Is it to do with where these things live.
>> I'd be very wary of this solution. Recently, enum has been shown to construct itself on every use.
>> So what I think is happening is every time you use A_RX_FILT, it's building a brand new AA (you can verify this by looking at the disassembly).
>> I'd recommend the static this solution in order to ensure you are not accidentally killing performance by just using that AA.
>> A while back, Don suggested that all literals should be considered immutable. I agree with him, but Walter still doesn't. If all literals are immutable, then they could be truly constructed at compile-time.
>> -Steve
I'm happy with the static this solution so will leave well alone. I generally keep mutable and immutable data structures apart so I tend to agree that literals should be immutable although of course I'm not aware of the pros and cons.
bob