为什么有些类型在默认初始化时未初始化,而另一些则没有?

问题描述 投票:0回答:1

我有点困惑为什么内置类型(如

int
)在自动存储期间默认初始化时未初始化,而像
std::string
这样的类则不然。

我阅读了以下 StackOverflow 帖子:Why do uninitialized objects ofbuilt-in type Defined inside a function body has undefined value?,其中解释了整数在自动存储期间保持未初始化,以防止多次调用函数时产生开销次。这是可以理解的,但是为什么不对字符串和向量做同样的事情呢?

是因为尝试处理未初始化的向量和字符串可能会导致比尝试处理未初始化的整数更严重的错误吗?这是我能想到的唯一解释。

c++
1个回答
2
投票

如果它们(向量和字符串)未初始化,它们将很难正确使用。

假设向量的设计使得

std::vector<int> v;
未初始化。如果之后您执行
v = {1,2,3};
,则
operator=
必须销毁现有的内存块(如果有)。如果指向它的指针未初始化,它如何判断是否存在现有内存?您现在可以引入第二种分配(assign_to_uninitialized?),它会忽略现有内容,但这很容易出错。

可以说将指针归零就足够了,但大小/容量则不然。这适用于上面的场景,但仍然很容易出错。

可以避免初始化的是

std::string
的嵌入式字符存储(用于SSO)。众所周知,libc++ 的
std::string
使用
std::string("")
而不是
std::string()
构造起来更快,因为前者除了将第一个字节设置为 null 之外,不会将存储清零。

© www.soinside.com 2019 - 2024. All rights reserved.