如果我想在另一个结构中复制一个结构(在C中),那么pro& Con的是什么:
struct1 = struct2;
VS
memcpy(&struct1, &struct2, sizeof(mystruct_t));
他们是等同的吗?性能或内存使用是否存在差异?
答案 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
存在风险,因为您可能会错误地解释结构大小。)