为什么有些类型在默认初始化时未初始化,而其他类型则不然?

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

我有点困惑为什么内置类型(如 int)在自动存储期间默认初始化时未初始化,而像 std::string 这样的类却没有。我阅读了以下堆栈溢出帖子,其中解释了整数在自动存储期间未初始化,以防止多次调用函数时产生开销。这是可以理解的,但是为什么不对字符串和向量做同样的事情呢?

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

c++
1个回答
0
投票

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

假设向量的设计使得

std::vector<int> v;
未初始化。如果之后您执行
v = {1,2,3};
,则
operator=
必须销毁现有的内存块(如果有)。如果指向它的指针未初始化,它如何判断是否存在现有内存?

您可以说将指针归零就足够了,但大小/容量却不够。我认为没有技术原因可以避免这种情况,但这肯定会让用户感到烦恼。

可以避免初始化的是

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

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