例如,声明引用而不将其赋值给某事会产生编译错误,例如。 int &refVar;
但这并不适用于指针。我得到了c ++跳过一些理智的默认功能,比如跳过绑定检查等以获得速度,但这个理论不适合指针变量。
为什么有人会声明一个指针变量而不是将它初始化为某个东西?为什么不NULL
/ 0
甚至nullptr
?大多数静态分析器实际指出了这个问题,但是定义这个未定义行为的可能原因是什么?这不是一个很好的错误来源吗?
答案 0 :(得分:4)
我认为很可能是由于初始化这些变量可能带来的开销。对于一个变量,这可能不是一个大问题,但想象一下在堆栈上分配的数组。
答案 1 :(得分:2)
原因是表现。想象一下,你知道你需要一个指针的情况,但它根据运行时变量指向不同的东西。
int* ptr;
cin >> something;
switch(something)
{
case 0: ptr = &a; break;
case 1: ptr = &b; break;
default: ptr = &c; break;
}
这里,默认初始化ptr可能会引入不必要的运行时开销。
答案 2 :(得分:1)
很可能,因为C ++希望与C非常兼容(或者至少旧的C ++版本想要与C99兼容)。
BTW(作为个人编码规则,可以讨论),我尝试在C和C ++中初始化任何标量变量。如果不需要初始化,优化编译器将删除它。否则,它有助于为我的程序提供更确定的行为。
答案 3 :(得分:0)
仅出于历史原因。回到过去,如果编译器优化是最基本的,并且刚刚引入了C ++,那么当没有使用C ++特性时,它的作者需要确保C ++代码与C代码一样快。否则,没有人会迁移到它。
因此他们使这个规则遵循C套件 - 自动变量没有默认初始化(例如,静态默认初始化)。现在,当然,每个标量都需要一个初始化器并且默认初始化它,除非在代码中稍后使用之前进行初始化,但没有人有能力这样做。