【发布时间】:2011-01-29 08:39:52
【问题描述】:
当 not 在 static 上下文中使用时(即,当 static 关键字不存在,并且您不在全局范围内时),shared 做什么而__gshared关键字呢?
例子:
struct Temp
{
shared int i;
__gshared int j;
}
【问题讨论】:
当 not 在 static 上下文中使用时(即,当 static 关键字不存在,并且您不在全局范围内时),shared 做什么而__gshared关键字呢?
例子:
struct Temp
{
shared int i;
__gshared int j;
}
【问题讨论】:
共享的 int 类型为 shared(int),它做任何事情,只是给它那个类型。 __gshared int 是无操作的——DMD 喜欢忽略无操作属性。
【讨论】:
shared int 在当前用于局部变量的 dmd 实现中只表现得像一个类型限定符(例如const),但正确实现的shared - 我理解它的方式 -应该具有读取-获取和写入-释放-语义(即在许多架构上使用内存栅栏并避免某些编译器优化,另请参见digitalmars.com/d/2.0/faq.html#shared_memory_barriers)。这有时甚至与局部变量相关,例如,在其他线程中执行闭包的情况下(或在极少数情况下跨线程堆栈访问)。
D2 默认为线程本地存储,而 C、C++ 和 D1 默认为全局存储。
其中一个区别是 D 中的全局变量对其他线程可见,而 TLS 不可见。
这听起来可能并不多,但请尝试在没有意识到这一点的情况下连接到 C 库。 (不可变的也是。全局的)
IME __gshared 几乎只存在于强制某些东西进入全局,而通常它不会。
它可能还有其他用途,但我还没有看到。
C 头文件中的全局变量就是一个例子。如果您尝试与它交互,您将需要不可变或 __gshared。当然还有其他方法,但这可能是最简单的。
【讨论】: