Вот здесь всё зависит от разработчиков компиляторов!
Конкретно ваш пример скомпилировался в очень простой вариант, где функция возвращает int, который затем присваивается и всё.
Я чуть усложнил задачу компилятору, чтобы он не смог сделать оптимизацию:
class samp {
public:
int a;
int b[0x100];
};
samp func() //Функция возвращающая локальный объект
{
samp ob2;
ob2.a=255;
for (int i = 0; i < 0x100; i++)
{
ob2.b[i] = i;
}
return ob2;
}
Что получилось после компиляции в MS Visual Studio 2008 (мой основной инструмент):
для чистоты эксперимента - Debug версия, без оптимизаций
samp * func(samp * result_ptr)
{
samp ob2;
ob2.a=255;
for (int i = 0; i < 0x100; i++)
{
ob2.b[i] = i;
}
memcpy(result_ptr, &ob2, sizeof(samp));
return result_ptr;
}
int main()
{
samp ob1;
samp result;
samp temp;
samp * retval;
retval = func(&result);
memcpy(&temp, retval, sizeof(samp));
memcpy(&ob1, &temp, sizeof(samp));
return 0;
}
как можно видеть, место под результат выделяется ещё до вызова функции, в области стека функции main, поэтому проблем не возникает.
Для более сложных классов с конструкторами и деструкторами будет ещё большая жесть.
P.S. samp? san andreas multiplayer?