memset和std :: complex <double>的动态数组

Zde*_*usa 2 c++ memset

由于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)

产生警告

清除非平凡类型的对象

我的问题是,这样做实际上有潜在的危害吗?

Jus*_*tin 5

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除非您的基准测试和性能分析表明这几条额外的说明引起了问题。