为什么c ++没有默认初始化

时间:2016-01-20 14:26:40

标签: c++ pointers c++11

例如,声明引用而不将其赋值给某事会产生编译错误,例如。 int &refVar;但这并不适用于指针。我得到了c ++跳过一些理智的默认功能,比如跳过绑定检查等以获得速度,但这个理论不适合指针变量。

为什么有人会声明一个指针变量而不是将它初始化为某个东西?为什么不NULL / 0甚至nullptr?大多数静态分析器实际指出了这个问题,但是定义这个未定义行为的可能原因是什么?这不是一个很好的错误来源吗?

4 个答案:

答案 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套件 - 自动变量没有默认初始化(例如,静态默认初始化)。现在,当然,每个标量都需要一个初始化器并且默认初始化它,除非在代码中稍后使用之前进行初始化,但没有人有能力这样做。