这个问题可能是link的重复,但我很好奇:
std::fill会发生什么坏事?在性能方面,在已经初始化的内存(当然,具有相同对象类型的内存)上使用的是与使用std::fill相同的更有益/更有害/完全相同的std::uninitialized_fill。
我读了answer,但找不到好的答案
发布于 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。
https://stackoverflow.com/questions/72926808
复制相似问题