如果我想在C语言中将一个结构体复制到另一个结构体,以下做法的优缺点是什么:
struct1 = struct2;
vs
的翻译是:vs。memcpy(&struct1, &struct2, sizeof(mystruct_t));
它们是否等效?性能或内存使用上是否有差异?
如果我想在C语言中将一个结构体复制到另一个结构体,以下做法的优缺点是什么:
struct1 = struct2;
vs
的翻译是:vs。memcpy(&struct1, &struct2, sizeof(mystruct_t));
它们是否等效?性能或内存使用上是否有差异?
struct1=struct2;
表示不仅更加简洁,而且更短,同时给编译器留下了更多的优化机会。 =
的语义是赋值,而 memcpy
只是复制内存。这在可读性上有很大的区别,尽管在这种情况下 memcpy
做的是相同的事情。
使用=
。
我不确定性能差异,尽管我猜测大多数编译器都会在底层使用memcpy。
在大多数情况下,我更喜欢赋值操作,它更易于阅读,并且更加明确其目的。想象一下,如果你更改了任何一个结构体的类型,编译器将引导你进行必要的更改,要么给出编译器错误,要么使用operator=(如果存在)。而第二种方法则可能会盲目复制,从而导致微妙的错误。
memcpy
,每个字节都是逐字复制的,这包括绝对内存指针、相对偏移量等等,应该很清楚。没有固有的原因说明哪个性能更好。不同编译器及其版本可能会有所不同,所以如果您真的关心性能,就需要进行性能分析和基于事实的基准测试来做决策。
直接赋值更易于阅读。
与赋值相比,赋指针给结构体稍微有点风险,因为您可能会将指针分配给结构体而不是指向结构体的指针。如果您担心这一点,您可以确保您的单元测试覆盖了这一点。我不会担心这种风险。(同样,memcpy
也存在风险,因为您可能会错误地获取结构体的大小。)
sizeof
和正确的结构体,那么memcpy
就没有任何风险。我想,如果您选择了错误的结构体,那么就会出现错误。不过,最终您可能会遇到分段错误。 - Michael K