C/C 如何复制结构?

新手上路,请多包涵

在 C/C++ 中按值传递结构时,必须复制结构内容。编译器如何实现这一点?即,该副本通常发出哪些汇编指令?

例如,与调用 memcpy 相比,这些速度有多快?

现在考虑这段代码:

 struct X { int i, j, k; };

void foo(X x);

void foo( int i, int j, int k);

调用 foo(X) 和 foo(int,int,int) 之间有什么区别,或者生成的汇编代码是否相同(考虑到参数的传递)?

原文由 gexicide 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 565
2 个回答

显然,如果有 structclass 的构造函数,则调用构造函数。

如果没有构造函数,则完全取决于编译器,但最有可能的是,对于三个整数大小的对象,它可能是三个单独 mov 指令。对于较大的结构,可以调用 memcpy 或类似于 memcpy 的内联版本。

如果结构非常大(几兆字节),那么真正的 memcpy 也很有可能比内联版本更快,编译器可能没有意识到这一点并使用内联版本。但是我们大多数人不使用兆字节的大型结构,所以我认为一般来说这不是太担心的事情。考虑到典型堆栈的大小有限,如果结构是兆字节大,则将结构作为参数复制到堆栈上可能不是一个好主意。

原文由 Mats Petersson 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 C++ 中

编译器如何实现这一点?

他们调用该类/结构的 复制构造函数。如果您不提供一个或您提供的一个,则隐式生成一个。

例如,与调用 memcpy 相比,这些速度有多快?

取决于类及其成员。剖析应该给你一个更清晰的画面。

但是,应避免使用 memcpy 复制类实例。

在 C 中

编译器如何实现这一点?

他们为该结构执行 浅拷贝。出于所有实际目的,您可以将其视为 memcpy

原文由 Alok Save 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题