在 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 许可协议
显然,如果有
struct
或class
的构造函数,则调用构造函数。如果没有构造函数,则完全取决于编译器,但最有可能的是,对于三个整数大小的对象,它可能是三个单独
mov
指令。对于较大的结构,可以调用memcpy
或类似于memcpy
的内联版本。如果结构非常大(几兆字节),那么真正的
memcpy
也很有可能比内联版本更快,编译器可能没有意识到这一点并使用内联版本。但是我们大多数人不使用兆字节的大型结构,所以我认为一般来说这不是太担心的事情。考虑到典型堆栈的大小有限,如果结构是兆字节大,则将结构作为参数复制到堆栈上可能不是一个好主意。