Nig*_*een 4 c c++ x86 assembly
我已经阅读了一些关于返回多个值的问题,例如在C++和Java中只有一个返回值的原因是什么?,从C++函数和https://softwareengineering.stackexchange.com/questions/203471/why-do-most-programming-languages-only-support-returning-a-single-value-from-af 返回多个值.
我同意用于证明多个返回值不是绝对必要的大多数参数,我理解为什么没有实现这样的功能,但我仍然无法理解为什么我们不能使用多个调用者保存的寄存器例如ECX和EDX返回这样的值.
使用寄存器而不是创建一个Class/Struct来存储这些值或通过引用/指针传递参数不是更快,两者都使用内存来存储它们吗?如果可以做这样的事情,那么任何C/C++编译器是否都使用此功能来加速代码?
编辑:理想的代码是这样的:
(int, int) getTwoValues(void) { return 1, 2; }
int main(int argc, char** argv)
{
(int a, int b) = getTwoValues();//a and b are actually returned in registers so future operations with a and b are faster
//do something with a and b
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,这有时候会完成.如果您在cdecl下阅读x86调用约定的Wikipedia页面:
cdecl的解释有一些变化,特别是如何返回值.因此,为不同的操作系统平台和/或不同的编译器编译的x86程序可能是不兼容的,即使它们都使用"cdecl"约定而不调用底层环境.一些编译器在寄存器对EAX:EDX中返回长度为2个寄存器或更少寄存器的简单数据结构,并且需要异常处理程序(例如,定义的构造函数,析构函数或赋值)进行特殊处理的较大结构和类对象返回记忆.为了传递"in memory",调用者分配内存并将指针作为隐藏的第一个参数传递给它; callee填充内存并返回指针,返回时弹出隐藏的指针.
(强调我的)
最终,它归结为呼叫惯例.您的编译器可以优化您的代码以使用它想要的任何寄存器,但是当您的代码与其他代码(如操作系统)交互时,它需要遵循标准调用约定,这通常使用1个寄存器来返回值.