C++ std::memmove在同一个对象之间总是安全的吗
在相同的对象实例(包括子对象)之间移动C++ std::memmove在同一个对象之间总是安全的吗,c++,language-lawyer,memmove,C++,Language Lawyer,Memmove,在相同的对象实例(包括子对象)之间移动std::memmove是否总是安全的 也就是说,对于任何T和任何T而言,以下各项是否安全,并且是否保持T不变: 模板 无效副本(T&T){ 标准:memmove(&t,&t,sizeof(t)); } 作为一个必然的问题,以下情况是否总是安全的: 模板 无效冗余副本(T&s、const T&d){ 如果(std::addressof(s)=std::addressof(d)){ 标准:memmove(&d,&s,sizeof(T)); } } 不,它并不
std::memmove
是否总是安全的
也就是说,对于任何T
和任何T
而言,以下各项是否安全,并且是否保持T
不变:
模板
无效副本(T&T){
标准:memmove(&t,&t,sizeof(t));
}
作为一个必然的问题,以下情况是否总是安全的:
模板
无效冗余副本(T&s、const T&d){
如果(std::addressof(s)=std::addressof(d)){
标准:memmove(&d,&s,sizeof(T));
}
}
不,它并不总是安全的
从
如果对象是或不是,则不会指定memmove
的行为
什么是潜在重叠?从 如果子对象是 。基类子对象,或
. 使用[[]]属性声明的非静态数据成员
我假设我不需要在这个答案中给出的定义。不,它并不总是安全的 从 如果对象是或不是,则不会指定
memmove
的行为
什么是潜在重叠?从 如果子对象是 。基类子对象,或
. 使用[[]]属性声明的非静态数据成员
我假设我不需要在这个答案中给出的定义。提到函数可能导致未定义行为的情况。这不能回答你的问题吗?@RSahu-不,不能回答,因为它适用于任意复制操作,而不适用于对象是同一对象的非常有限的情况。特别是,标准中有各种各样的例子,当字节从对象复制到char缓冲区,然后再复制回来时,会应用一些特殊条件,因此这种情况通常是不同的。提到函数可能导致未定义行为的情况。这不能回答你的问题吗?@RSahu-不,不能回答,因为它适用于任意复制操作,而不适用于对象是同一对象的非常有限的情况。特别是,标准中有各种各样的例子,当字节从对象复制到char缓冲区,然后再复制回来时,会应用一些特殊条件,因此这种情况通常是不同的。