c++ - 如何使用 memcpy 复制联合简单成员?
问题描述
我不太确定关于memcpy
和union
琐碎成员的标准报价。
考虑代码:
struct Test{
union
{
void(*function_p)(void*);
void(*function_p_c)(const void*);
};
Test(const Test &other)
{
using std::memcpy;
memcpy(&function_p, &other.function_p, sizeof(function_p)); //?
memcpy(&function_p_c, &other.function_p_c, sizeof(function_p_c)); //??
}
};
int main(void)
{
Test t1; t1.function_p = NULL; //let it be NULL for c++98 sake
Test t2(t1); // is it safe? does this set new active member of union?
return 0;
}
所以一个问题引出另一个问题:
上面的代码安全吗?
memcpy
或者它是第二个/第一个取决于哪个union
成员用户触摸的 UB ?召集memcpy
两个成员是不是有点矫枉过正?如果它不安全,那么我如何在没有一些活动联合成员标志的情况下实现复制构造函数?
解决方案
您对两个 memcpy 所做的是未定义的行为。
联合体的大小只有容纳其最大数据成员所需的大小。其他数据成员分配在与该最大成员的一部分相同的字节中。该分配的细节是实现定义的,从最近未写入的联合成员中读取是未定义的行为。许多编译器作为非标准语言扩展实现了读取联合的非活动成员的能力。
other
仅function_p
具有活动状态,并且第二个 memcopy 触发未定义的行为。
推荐阅读
- android - Android Studio - Gradle 同步失败
- linux - 从现有 SD 卡创建可启动映像(以便 Mender 能够转换它)
- woocommerce - Woocommerce Hook 上的语法错误(T_ENCAPSED_AND_WHITESPACE)
- delphi - 我在使用 urldecode 方法时遇到错误
- javascript - JavaScript替换数组值和移位增量数
- actions-on-google - 在 Google Assistant App 中拨打电话的问题
- maven - 为 Maven pom 提供外部参数并在 application.properties 文件中替换相同的参数
- java - 在数组中打印用户输入显示为空
- php - mysql php的左连接查询
- java - 如何克服此错误“com.mongodb.diagnostics.logging.JULLogger log”