首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ std::fill vs std::uninitialized_fill

C++ std::fill vs std::uninitialized_fill
EN

Stack Overflow用户
提问于 2022-07-10 07:24:14
回答 1查看 309关注 0票数 1

这个问题可能是link的重复,但我很好奇:

  1. 如果我在未初始化的原始内存上使用std::fill会发生什么坏事?

在性能方面,在已经初始化的内存(当然,具有相同对象类型的内存)上使用的是与使用std::fill相同的更有益/更有害/完全相同的std::uninitialized_fill

我读了answer,但找不到好的答案

EN

回答 1

Stack Overflow用户

发布于 2022-07-10 07:38:53

如果我使用std::填充未初始化的原始内存,会发生什么不好的事情?

如果在调用之前没有在存储中隐式或显式地创建适当的对象,那么它将具有未定义的行为。

在性能方面,在已经初始化的内存(当然,具有相同对象类型)上使用

与使用std::std::uninitialized_fill相同吗?

他们不做同样的事。std::fill进行赋值,std::uninitialized_fill构造新对象。这两个操作的行为可能非常不同,其中一个是不可替换的。

注意,在使用C++20之前,可以按照您建议的方式使用std::uninitialized_fill的位置有一些限制。也就是说,如果类型包含引用类型的非静态数据成员或const子对象,则会导致未定义的行为。

此外,通常,在使用std::uninitialized_fill放置新对象之前,您需要先手动销毁对象。否则,如果类型具有非平凡的析构函数,则至少会有内存/资源泄漏的风险,如果析构函数调用具有重要的副作用,则可能会出现未定义的行为。

此外,如果其中一个构造抛出异常,std::uninitialized_fill将销毁已经构造的对象,这意味着如果操作抛出,您可能会“丢失”一些对象,在这种情况下,原始对象的所有者在试图销毁它们时会导致未定义的行为。

即使您的类型有微不足道的破坏,如果您所处的情况是std::fill不工作,但std::uninitialized_fill工作,那么很有可能您正在尝试做一些您不应该做的事情。

例如,std::uninitialized_fill可以按您建议的方式使用,以其他方式修改对象,而不是因为类没有提供相应的接口。如果您仍然使用std::uninitialized_fill,那么很有可能您正在打破这些对象所有者的假定不变。

实际上,很少有理由使用std::uninitialized_fill。只有当您在某个字节缓冲区中手动管理对象时,才应该使用std::uninitialized_fill

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72926808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档