Manifest constants: why enum instead of invariant?

Bruno Medeiros brunodomedeiros+spam at com.gmail
Tue Apr 29 04:20:47 PDT 2008


Don wrote:
> Bill Baxter wrote:
>> Bruno Medeiros wrote:
>>> Picking up and idea which had crossed my mind, and that Oskar Linde 
>>> briefly mentioned on the const debacle thread 
>>> (news://news.digitalmars.com:119/fsirc9$2hll$1@digitalmars.com):
>>>
>>> Why do we need enum instead of invariant to declare manifest constants?
>>>
>>> (I have the feeling that this has been discussed before in the 
>>> manifest constants debate but I can't remember it nor find it)
>>>
>>> An invariant variable offers all the power than enum does for 
>>> manifest constants. The only difference of enum's manifest constants 
>>> is that they are not an lvalue (their address cannot be taken). But 
>>> that's a *restriction*, it's not a useful property.
>>>
>>> The only possible advantage I see is that of optimization: manifest 
>>> constants do not take up space. But that *hardly* seems significant: 
>>> manifest constants are usually numeric, and thus occupy about 2-4 
>>> bytes each. Even if they are many, in total they are not going to 
>>> occupy that much space. A string literal can easily occupy as much 
>>> space as several manifest constants, and they are likely going to be 
>>> many string literals abound.
>>>
>>
>> The space *is* a significant problem apparently.  There have been many 
>> complaints about the size added to an exe simply by linking in early 
>> versions of the Windows headers because of all the constants they define.
>>

Around how many bytes are we talking about here, just to get a concrete 
idea, does anyone know? I'm not familiar with the windows headers nor 
their D bindings, although I recently checked some of the windows d 
headers and there were many manifest constants. But I still don't know 
if their size would amount to something that significant. If for 
example, you have a cmd line program that prints one page of it's 
syntax/usage, just that single string would occupy the same space as 400 
manifest constants or more.

>> But I suppose you could also look at that and say "we need to fix the 
>> linker & optimizer" instead of "we need to fix the language".
> 
> Indeed. Manifest constants are required primarily as a workaround for 
> the linker; the linker should be able to discard them. In practice, most 
> of the time, invariant will probably be used anyway. I think much of the 
> furore about using enum for constants fails to recognise how minor the 
> feature is.
> 
> IMHO, the unfortunate thing about using enum for manifest constants is 
> that it destroys any chance of better enums.

Yes, if that's just the case, then it's a very minor feature indeed, 
both because it arises in an uncommon situation (using windows headers), 
it could be fixed by the compiler/linker.

-- 
Bruno Medeiros - Software Developer, MSc. in CS/E graduate
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list