我们能否在C ++ 17中检测到“平凡的可重定位性”?

问题描述 投票:1回答:1

在将来的C ++标准中,我们将拥有“平凡的可重定位性”的概念,这意味着我们可以简单地将字节从一个对象复制到未初始化的内存块中,而只需忽略/清零原始对象的字节即可。这样,我们模仿了C风格的复制/移动对象的方式。

在将来的标准中,我们可能会使用类似std::is_trivially_relocatable<type>的类型特征。当前,我们拥有的最接近的东西是std::is_pod<type>,它将在C ++ 20中弃用。

我的问题是,在当前标准(C ++ 17)中,我们是否有办法弄清楚该对象是否可重定位?例如,可以通过将std::unique_ptr<type>的字节复制到新的内存地址并清零原始字节来进行移动,但是std::is_pod_v<std::unique_ptr<int>>false

此外,当前的标准要求是,每个未初始化的内存块都必须通过构造函数,才能被视为有效的C ++对象。即使我们能够以某种方式找出对象是否可重定位,如果我们只是移动字节,根据标准它仍然是UB。因此,另一个问题是-即使我们能够检测到微不足道的可重定位性,如何在不导致UB的情况下实现微不足道的重定位?只需调用memcpy + memset(src,0,...)并将内存地址转换为正确的类型就是UB。`

谢谢!

在将来的C ++标准中,我们将具有“平凡的可重定位性”的概念,这意味着我们可以简单地将字节从一个对象复制到未初始化的内存块中,而只需忽略/归零...

c++ object memory c++17 typetraits
1个回答
4
投票
琐碎可重定位性的全部要点是即使存在非琐碎的move构造函数或move赋值运算符,也可以使对象按字节移动。即使在当前的提案P1144R3中,这最终也要求用户

手动

© www.soinside.com 2019 - 2024. All rights reserved.