复制简单结构体时memcpy和'='的区别
Difference between memcpy and '=' when copying simple struct
考虑copy是一个简单的结构体,不需要特殊的复制语义。
struct A
{
char i
int i;
long l;
double b;
//...maybe more member
}
struct A a;
a.c = 'a'; //skip other member just for illustrate
struct A b;
memset(&a, 0, sizeof(a));
b.c = a.c;
//...for other members, the first way to assign
memcpy(&b, &a, sizeof(b)); //the second way
b = a; //the third way
这三种方法做同样的事情,似乎他们都是正确的。我曾经使用'memcpy'来复制简单的结构体,但现在看来'='也可以做同样的事情。那么使用memcpy
和'='之间有什么区别吗?
memcpy
将该结构视为一个连续的字节数组,并复制所有这些字节。因此,它将始终复制成员后的填充字节。
=
只需要复制成员。它可能会也可能不会复制padding
我会养成使用=
而不是memcpy
的习惯。在C语言中,这种差异充其量是微乎其微的,但一旦你学会了c++,正如问题所示,这种差异是巨大的。例如
struct C {
C() { }
~C() { }
}
C local1;
C local2;
memcpy(&local2, &local1, sizeof(C));
在这种情况下,local2
的构造函数在声明点运行。然而,该值的析构函数永远不会运行。相反,它的成员被神奇地替换为memcpy
,析构函数在memcpy
位上运行。如果C
碰巧分配了任何资源,这很容易导致泄漏。
这三种方法中的任何一种——手动为每个成员赋值、为整个结构赋值或使用memcpy——都会导致b
的所有成员与a
的相应成员相同,这是您应该关心的。潜在的差异在于pad字节的值——memcpy
会复制它们,不会给单个成员赋值,也可能不给整个结构赋值——这取决于实现。有些实现只使用memcpy
来赋值结构,有些则逐个成员赋值,有些则根据结构体的大小等因素分别赋值。
我推荐使用结构赋值——它是最简单、最短和最面向问题的。将实现细节留给编译器。此外,在c++中,您可以自己定义赋值操作符以获得更大的控制和灵活性,并且memcpy是不受欢迎的,并且可能对类产生不良影响(参见JaredPar的回答)。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 在c++中用vector填充一个简单的动态数组
- int(c) 和 c-'0' 之间的区别。C++
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 使用简单类型列表实现的指数编译时间.为什么
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 如何在BST的这个简单递归实现中消除警告
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 一种在C++中读取TXT配置文件的简单方法
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 在getline上检查eof()有什么区别,即while(!getline().eof())和简单地检查while(ge
- 嵌套锁和简单锁之间的区别
- 外部"C"和简单的外部之间的区别
- 复制简单结构体时memcpy和'='的区别