<div class="gmail_quote">On 21 April 2012 00:05, Jonathan M Davis <span dir="ltr"><<a href="mailto:jmdavisProg@gmx.com">jmdavisProg@gmx.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Friday, April 20, 2012 23:45:11 Manu wrote:<br>
> I need to clarify some things that have confused me a few times. I've<br>
> reconsidered these basic attributes a few times, and I thought I understood<br>
> them, but I obviously don't.<br>
><br>
> The case that has confused me is here:<br>
> <a href="http://d.puremagic.com/issues/show_bug.cgi?id=7897" target="_blank">http://d.puremagic.com/issues/show_bug.cgi?id=7897</a><br>
><br>
> In the global scope:<br>
><br>
> int x; <- x is TLS<br>
><br>
> but:<br>
><br>
> static int x; <- this is... a 'static' global instance, whatever that<br>
> means? Is this TLS or not? If so, how is it distinct from 'int x;' above? I<br>
> presume it must still be TLS, and effectively meaningless at the global<br>
> scope; <a href="http://dlang.org" target="_blank">dlang.org</a> states "static is ignored when applied to other<br>
> declarations". It is just used for members of struct/classes? Why not<br>
> produce a syntax error rather than ignore it?<br>
<br>
</div>Attributes get ignored all over the place in D. There's at least one bug<br>
report, on it:<br>
<br>
<a href="http://d.puremagic.com/issues/show_bug.cgi?id=3934" target="_blank">http://d.puremagic.com/issues/show_bug.cgi?id=3934</a><br>
<br>
Whether that'll change or not, I don't know, since it's not clear that Walter<br>
considers it to be a problem from what I recall about his comments on<br>
discussions on it.<br></blockquote><div><br></div><div>Hmm, I tend to think it would be valuable to have a warning or error in the case of redundant attribution, that way I know I'm not polluting my code with spurious junk, but I can see there might be some implication for meta-programming.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> static immutable x; <- i've seen this a few times, what does it mean?</div><div class="im">
<br>
</div>Assuming that static is valid in that context, it means that you have a static<br>
variable which is immutable. If it's not valid (e.g. module-level variable),<br>
then it's just an immutable variable. In either case, because it's immutable,<br>
it's implicitly shared.<br></blockquote><div><br></div><div>Implicitly 'shared', or implicitly '__gshared'? .. In this case, there should be no practical difference, but 'shared' comes loaded with some other bonuses that claim it may perform auto-locking when it is accessed, which is obviously not necessary for anything immutable.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> There's another thing that that's had me scratching my head for a while,<br>
> and gave me the contradictory feeling that the use of TLS data is fairly<br>
> relaxed:<br>
><br>
> struct S<br>
> {<br>
> int x;<br>
> static int y;<br>
> }<br>
><br>
> In this case y is static, ie, globally shared by all instances, but I<br>
> expect it SHOULD be TLS, since it is mutable, and therefore not thread<br>
> safe...<br>
> That said, I write code that passes static members of structs into<br>
> templates as alias parameters all the time, and generate code that writes<br>
> to them.<br>
> How is this possible? And given that it is, why is it not possible for at<br>
> least __gshared at global scope?<br>
<br>
</div>I don't understand the problem. y is static, so there's a single instance for<br>
it for the class <u><b>per thread</b></u>, whereas each instance of S will have its own x. I<br>
think that I'd have to see actual code to understand exactly what your issue<br>
is with regard to templates.<br></blockquote><div><br></div><div>I think you've missed my point. If y is TLS, then it's location can't be known at compile time, in which case, how is it possible to supply it an an alias template parameter?</div>
<div>And given that it IS possible, I don't understand why it is not possible to alias something that is __gshared.</div><div><br></div><div>This is the main thing I'm trying to understand.</div><div>What mechanisms affect whether the compiler knows the address of static/global/shared variables at compile time or not? TLS being the obvious one, but that seems to contradict observation in both cases here.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> struct S<br>
> {<br>
> static x;<br>
> __gshared y;<br>
> }<br>
><br>
> What is the difference between x and y here?<br>
<br>
</div>x is in TLS, so there's one instance per thread. I'm not quite sure whether<br>
__gshared does anything here though, since it's a member variable rather than<br>
a class variable or module-level variable. I expect that __gshared is ignored<br>
here, but I don't know. If you had<br>
<br>
struct S<br>
{<br>
 static x;<br>
 static __gshared y;<br>
}<br>
<br>
then there would be one instance of y for the entire program, but it wouldn't<br>
be protected in the same way that it would be if it were shared.<br></blockquote><div><br></div><div>But the documentation for __gshared states that this is not necessary, it says quite clearly that __gshared is the same as 'static' in this context, but that doesn't make sense, since static should be TLS, but __gshared is not...</div>
</div>