我需要维护一个程序,里面有很多memset。在现代C++中使用memset是一个好的实践吗?
为什么?或者为什么不?
如果不是,那么应该优先考虑什么替代方法?
我需要维护一个程序,里面有很多memset。在现代C++中使用memset是一个好的实践吗?
为什么?或者为什么不?
如果不是,那么应该优先考虑什么替代方法?
90%的情况下,您应该使用std::fill
而不是memset。这是因为std::fill
可以正确处理类,并且在将非字节类型的数组设置为非零值时也可以正常工作。例如,您可以将一个int数组的值memset为0,但不能将其值memset为0x12345678。但是,使用std::fill
就可以做到。
好的编译器可以将std::fill
优化为适当的memset。在它们不这样做的情况下,任何性能影响都可能是微不足道的。
在memset应该使用std::fill
的情况下,使用std::fill
并不危险。但是,在应该使用std::fill
的情况下使用memset是危险的。默认使用std::fill
。
对于memcpy
和std::copy
同样适用。
memset
。那么,在什么情况下应该使用memset
而不是std::fill
呢? - Z bosonmemset()
只有可能适用于标准布局类型。即使对于这些类型,其值也不一定可预测。例如,没有保证空指针将具有所有空字节,尽管我不知道任何不使用所有空字节的空指针的系统。memset()
将初始化填充。此外,调用构造函数涉及开销:如果需要初始化多个对象,则使用 memset()
更加高效。在我编写的代码中,我并不经常遇到需要批量初始化许多对象的情况,即对我来说性能论点并不存在。memset()
初始化对象,而是使用生成的构造函数。要初始化对象序列,我要么依赖容器完成工作,要么使用适当的 fill()
或 uninitialized_fill()
。在很少情况下,我看到频繁使用 memset()
来初始化对象,这总是错误的,即我认为使用 memset()
是一个警告信号,尽管它可以正确使用。std::vector<T>
的东西时)使用合适的算法。如果性能表明它实际上有所不同,并且正在初始化的对象是标准布局类型,则可能会选择 memset()
,但我不知道,因为我从未遇到过必须初始化许多标准布局(或 POD)类型的情况。memset()
很棒 - 就用它吧”),但我仍然对这个踩票的原因感兴趣。 - Dietmar Kühlstd::fill()
或std::fill_n()
来完成,如果它是一个序列而不是memset()
。 - Dietmar Kühl
std::fill
,它可以在可能的情况下优化为memset
并且可用于类。 - Neil Kirkfill()
жҳҜйҰ–йҖүпјҢдҪҶжҲ‘зӣёдҝЎеңЁжҹҗдәӣжғ…еҶөдёӢmemset()
еҸҜиғҪжӣҙдјҳгҖӮиҝҷйҮҢжҳҜжҲ‘еҝ«йҖҹжҗңзҙўеҲ°зҡ„дёҖдёӘдҫӢеӯҗпјҡhttps://dev59.com/questions/H2445IYBdhLWcg3wBl2J - NPEmemset()
是否是良好实践的问题,而不是回答是否有更好的方法的问题。 - NPE