结构赋值还是memcpy? [复制]

Posted

技术标签:

【中文标题】结构赋值还是memcpy? [复制]【英文标题】:Struct assignment or memcpy? [duplicate] 【发布时间】:2011-07-19 23:48:50 【问题描述】:

如果我想在另一个结构中复制一个结构(在 C 中),有什么优点和缺点:

struct1 = struct2;

memcpy(&struct1, &struct2, sizeof(mystruct_t));

它们是等价的吗?性能或内存使用有区别吗?

【问题讨论】:

请注意结构内部的内存分配。例如,如果您有一个包含指向字符串的指针的结构,并且您为该字符串分配内存。该内存不会被复制。指向内存的指针被复制,但不是内存本身。换句话说,这种类型的分配不是深拷贝。那个母校的香草 memcpy 也不是。谁拥有分配的内存可能会让人感到困惑。 我觉得这个问题更适合 ***。 我认为这个问题在这里已经得到了很好的回答:***.com/q/4931123/176769 【参考方案1】:

struct1=struct2; 表示法不仅更简洁,而且更短,为编译器留下了更多优化机会。 =的语义是赋值,而memcpy只是拷贝内存。这也是可读性的巨大差异,尽管memcpy 在这种情况下也是如此。

使用=

【讨论】:

s = mystruct 在 struct s 和 struct * s 之间的主要问题。两者都可以很好地与equals一起使用,因此您无法通过阅读来看到差异。 *s 给你相同的,而 struct s 给你一个副本。当需要释放时,这适用于相同的 struct * s;但是如果你愚蠢地只用 struct 的版本做一个 dealloc,它就会泄漏 mystruct 。使用指针也更快。只要记住你正在做的事情,然后一切都会好起来的。 YMMV。【参考方案2】:

查看关于同一主题的对话:http://bytes.com/topic/c/answers/670947-struct-assignment

基本上,关于该线程中关于结构副本将做什么的极端情况存在很多分歧。如果结构的所有成员都是简单值(int、double 等),这很清楚。数组和指针以及填充字节会发生什么混淆。

关于memcpy 发生的一切都应该非常清楚,因为这是每个字节的逐字副本。这包括绝对内存指针、相对偏移量等。

【讨论】:

【参考方案3】:

我不确定性能差异,但我猜大多数编译器会在后台使用 memcpy。

在大多数情况下,我更喜欢这个作业,它更容易阅读,并且更明确地说明目的是什么。想象一下,您更改了任一结构的类型,编译器将指导您进行哪些更改,或者给出编译器错误或使用 operator=(如果存在)。而第二个会盲目地复制,可能会导致细微的错误。

【讨论】:

【参考方案4】:

没有一个内在的理由可以说明为什么其中一个的性能会比另一个更好。不同的编译器和它们的版本可能会有所不同,所以如果你真的关心,你可以分析和基准测试并使用事实作为决定的基础。

简单的作业更容易阅读。

分配出错的风险很小,因此您将指针分配给结构而不是指向的结构。如果您担心这一点,您将确保您的单元测试涵盖这一点。我不会在意这种风险。 (同样,memcpy 有风险,因为您可能会弄错结构大小。)

【讨论】:

如果你使用sizeof 和正确的结构,memcpy 没有任何风险。我想你可能会弄错结构并且不会有错误。我认为您最终可能会遇到分段错误。

以上是关于结构赋值还是memcpy? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥通过直接赋值复制结构会失败?

c语言如何实现结构体的深度复制

Golang复制结构体

Golang复制结构体

memcpy不能复制内存重叠区域

如何复制一个含qstring的结构体