与C或C ++相比,D的一个奇怪方面是,当未提供赋值时,变量默认根据其类型进行初始化。
int foo() {
int o; // int.init == 0
o++;
return o; // returns 1
}
与C和C ++相比,D和C ++只是将变量留给了潜在的垃圾,D确保从几乎所有类型的变量中都不会读取垃圾。但是,考虑到这个简单的,仅仅是假设的函数,r
在设置为i
之前永远不会被读取,并且可以肯定最终会发生赋值。
int foo2(int n) {
assert(n > 0 && n < 20);
int r;
for (int i = n ; ; i+=7) {
if (i % 3 == 0) {
r = i;
break;
}
}
return r;
}
答案 0 :(得分:7)
- 在确定将来没有先前读取的情况下定义变量的情况下,根据标准,默认初始化是否仍会发生?
醇>
由于D没有值类型构造函数(默认struct
构造函数),初始化不应该有任何副作用,因此允许编译器优化它。我相信这是死亡任务消除的一个子集。
- 是否可以从DMD / GDC编译器中了解它们(例如,在从未从变量中读取默认值时省略默认初始化)?
醇>
语言规范并未对实现必须执行的优化施加约束。上面的例子是非平凡的,所以我不会感到惊讶,例如DMD不会对其进行优化,或者GDC是否会达到最大优化级别。
- 如果没有上述内容,是否有一个很好的解决方案来拥有一个完全未初始化的变量?
醇>
是:int r = void;