怎么能用memcpy复制工会简单的成员?
How could one copy union simple members with 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
的 UB,具体取决于成员用户接触union
? 为两个成员打电话memcpy
是不是矫枉过正?如果它不安全,那么我如何在没有一些活动联盟成员标志的情况下实现复制构造函数?
你用两个memcpy做什么是未定义的行为。
该联盟的大小取决于拥有其最大数据成员所需的规模。 其他数据成员以相同的字节分配,作为其中的一部分 最大的成员。该分配的详细信息是 实现定义的,并且从 最近不是写的工会成员。许多编译器 实现作为非标准语言扩展的阅读能力 工会的非活跃成员。
other
只有function_p
处于活动状态,第二个内存拷贝会触发未定义的行为。
由于两个工会成员在内存中占据相同的空间,因此第二个 memcpy 将覆盖第一个内存。
相关文章:
- 引用基类模板的成员变量的简单方法
- 返回值的简单模板类成员函数专用化
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 怎么能用memcpy复制工会简单的成员?
- 为什么 SFINAE 在这个简单的成员函数重载中不起作用
- 简单,但找不到:使用类型类的 STL 队列的成员变量的语法
- 使用并集的简单结构中的成员变量别名
- 我应该在简单的访问成员函数中使用 const 返回类型吗?
- 创建返回对象引用的成员函数的最简单方法
- 比较来自同一类型的两个对象的数据成员的最简单方法
- 遍历对类成员的引用,简单且最好是可重用的
- 在 C++11 中选择性地禁用模板成员的简单方法
- 在 C++11 之前启动容器类成员的简单方法
- 简单的 Java 代码,在创建等效C++(私有静态成员和公共访问器方法)时遇到问题
- 是否有一种简单的方法来初始化c++中的动态数组数据成员?
- 方法内部的简单c++成员引用(方法解析后的链接器错误)
- 存储抽象成员,保持接口简单
- (简单?)指针指向非静态成员函数的问题
- 打印成员函数地址的最简单方法是什么?
- 对传递给模拟函数的参数调用成员函数的最简单方法是什么?