![]() |
1
21
没有;没有副本。 调用者的数据返回值的地址实际上作为隐藏参数传递给函数,而createdata函数只是写入调用者的堆栈帧。 这被称为 named return value optimisation . 也看到 c++ faq on this topic .
您可以通过向结构添加带有printf的析构函数来演示这一点。如果此按值返回优化正在运行,则只能调用析构函数一次,否则调用两次。 此外,您还可以检查程序集,以查看是否发生这种情况:
下面是程序集:
奇怪的是,它在堆栈上为数据项分配了足够的空间
|
![]() |
2
7
的确如此!在堆栈上分配声明为局部变量的大型结构。很高兴把这件事弄清楚。 至于避免复制,正如其他人所指出的:
|
![]() |
3
6
有很多例子,但基本上 这个问题没有确切的答案。它将取决于编译器。C不指定从函数返回的结构的大小。 下面是对一个特定编译器的一些测试,即x86 RHEL 5.4上的GCC4.1.2 GCC普通案例,不复制
GCC更现实的情况,在堆栈上分配,memcpy到调用者
一般合同条款第4.4.2款已经增长了很多,并没有复制上述非平凡的情况。
此外,vs2008(将上述编译为c)将在createdata()的堆栈上保留结构数据,并执行
|
![]() |
4
4
MSVC(6,8,9)和
|
![]() |
5
1
Linux上的gcc将发出memcpy()以将结构复制回调用方的堆栈上。如果函数具有内部链接,则可以使用更多的优化。 |