由于std :: complex是非平凡的类型,请使用GCC 8.1.1编译以下内容
complex<double>* z = new complex<double>[6];
memset(z,0,6*sizeof*z);
delete [] (z);`
Run Code Online (Sandbox Code Playgroud)
产生警告
清除非平凡类型的对象
我的问题是,这样做实际上有潜在的危害吗?
std::memset仅当要修改的指针是指向TriviallyCopyable类型的指针时,才定义的行为。std::complex保证是LiteralType,但据我所知,不能保证是TriviallyCopyable,这意味着它std::memset(z, 0, ...)不是可移植的。
也就是说,std::complex具有数组兼容性保证,该保证指出a的存储std::complex<T>正好是两个连续的Ts,可以这样重新解释。这似乎表明std::memset实际上是可以的,因为它将通过这种面向数组的访问进行访问。这也可能暗示它std::complex<double> 是 TriviallyCopyable,但我无法确定。
如果您希望这样做,建议您保持安全,static_assert并且std::complex<double>可以使用TriviallyCopyable:
static_assert(std::is_trivially_copyable<std::complex<double>>::value);
Run Code Online (Sandbox Code Playgroud)
如果该断言成立,那么可以保证您memset是安全的。
无论哪种情况,都可以安全使用std::fill:
std::fill(z, z + 6, std::complex<double>{});
Run Code Online (Sandbox Code Playgroud)
它优化了对的调用memset,尽管之前还有一些其他说明。我建议您使用,std::fill除非您的基准测试和性能分析表明这几条额外的说明引起了问题。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |