【发布时间】:2015-10-08 10:24:43
【问题描述】:
我已经阅读了一些关于返回多个值的问题,例如 What is the reason behind having only one return value in C++ and Java?、Returning multiple values from a C++ function 和 Why do most programming languages only support returning a single value from a function?。
我同意大多数用于证明多个返回值并非绝对必要的论点,并且我理解为什么尚未实现此类功能,但我仍然不明白为什么我们不能使用多个调用者- 保存的寄存器(例如 ECX 和 EDX)返回这些值。
使用寄存器而不是创建一个类/结构来存储这些值或通过引用/指针传递参数不是更快吗,两者都使用内存来存储它们?如果可以做到这一点,是否有任何 C/C++ 编译器使用此功能来加速代码?
编辑:
理想的代码应该是这样的:
(int, int) getTwoValues(void) { return 1, 2; }
int main(int argc, char** argv)
{
// a and b are actually returned in registers
// so future operations with a and b are faster
(int a, int b) = getTwoValues();
// do something with a and b
return 0;
}
【问题讨论】:
-
逻辑上你可以
return多个值,如果你的return一个struct。 -
但是如果我返回一个结构,我不会返回一个指向内存中该结构的指针,该指针将用于在函数返回后获取值吗?
-
好吧,fastcall 使用寄存器作为 ecx 和 edx 中的前 2 个参数并返回 eax,它并不比默认的 cdecl 调用约定快多少。一些基准测试甚至显示 fastcall 更慢。
-
您是否有示例代码会生成比您喜欢的更差的机器代码(在优化的构建中)?
-
@user2565020 这是一个由编译器决定的实现细节
标签: c++ assembly optimization x86 return-value