所以我的理解是,如果我有SomeType foo,SomeType的默认构造函数将被调用,foo将被初始化。但是如果我有int x --根据规范这是没有定义的。为什么不调用默认构造函数(int())?
发布于 2020-04-28 06:20:23
为什么不调用默认构造函数(
int())?
如果程序员希望这些对象保持未初始化状态,则该语言不想强加调用构造函数和初始化这些对象的成本。
澄清一下:
int x;不会导致未定义的行为。使用x而不对其进行初始化或显式设置值是导致未定义行为的原因。
一个例子
这允许程序员分配大块内存作为缓冲区,稍后可以使用放置new初始化对象。
char* buffer = new char[SOME_LARGE_BUFFER_SIZE];以及以后的
// Construct an object in dynamically allocated memory, buffer.
SomeObject* obj = new (buffer+offset) SomeObject;考虑到buffer的用法,初始化buffer的每个元素对用户没有任何价值。考虑到用例,初始化这些对象的成本是不必要的。
发布于 2020-04-28 06:41:31
你的直觉实际上是对的。事后看来,未初始化的int x; (以及SomeType foo;可能会留下一些未初始化的成员)是bug和安全bug的源泉。理性是,正如R Sahu指出的那样,“不为你不需要的东西付费”是C++的核心哲学。现在看来,初始化本地int变量可能是性能问题的根源,特别是在当今的优化器中,但在过去是这样的。
今天,仍然需要在定义变量之后对其进行未初始化(例如,考虑一下之后需要填充的数组)。但在C++中处理它的方式是不幸的(事后看来)。
一个更好的选择是不允许未初始化的变量,除非程序员明确要求它,例如:
int x = unitialized; // where uninitialized is a keyword..。再说一次,事后看来。
现在几乎所有的指南都建议总是初始化你的变量,为了做到这一点,你可以使用一些技巧:
auto总是使用auto来初始化你的变量,例如int x{};
{}来强制你进行初始化,例如https://stackoverflow.com/questions/61469367
复制相似问题