When making a call such as a = foo();
, the compiler might push the address of the result structure on the stack and passes it as a "hidden" pointer to the foo()
function. Effectively, it could become something like:
void foo(MyObj *r) {
struct MyObj a;
// ...
*r = a;
}
foo(&a);
However, the exact implementation of this is dependent on the compiler and/or platform. As Carl Norum notes, if the structure is small enough, it might even be passed back completely in a register.