结构分配或memcpy?

时间:2011-03-21 13:50:55

标签: c struct variable-assignment memcpy

如果我想在另一个结构中复制一个结构(在C中),那么pro& Con的是什么:

struct1 = struct2;

VS

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

他们是等同的吗?性能或内存使用是否存在差异?

4 个答案:

答案 0 :(得分:34)

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

使用=

答案 1 :(得分:4)

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

基本上,关于结构副本将做什么的那个线程中的极端情况存在很多分歧。很明显,结构的所有成员都是简单的值(int,double等)。这种混淆伴随着数组和指针以及填充字节的发生。

对于memcpy会发生什么,一切都应该非常明确,因为这是每个字节的逐字副本。这包括绝对内存指针,相对偏移等。

答案 2 :(得分:2)

我不确定性能差异,虽然我猜大多数编译器都会使用memcpy。

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

答案 3 :(得分:2)

没有固有的理由说明为什么一个人的表现要比另一个人好。不同的编译器及其版本可能会有所不同,因此如果您真的关心,您需要对事件进行分析和基准测试,并将事实作为决定的基础。

直接分配更清晰易读。

分配是错误的风险,所以你指定结构的指针而不是指向的结构。如果您担心这一点,您将确保您的单元测试涵盖此内容。我不在乎这种风险。 (类似地,memcpy存在风险,因为您可能会错误地解释结构大小。)