Да. Многие компиляторы имеют специальное ключевое слово или атрибут типа, который можно использовать для указания того, что структура должна передаваться в регистрах, а не в стеке. Это чаще встречается на процессорах, которые имеют много регистров и глубоких конвейеров, таких как PowerPC, и может стать огромным улучшением производительности в архитектурах, где запись значения в память и последующее повторное чтение сразу же вызывают остановку конвейера.
Обычно вы используете его только для структуры, которая имеет тот же размер, что и собственный регистр. В частности, это полезно на процессорах, которые имеют широкие регистры SIMD, которые могут пропускать 16 байтов за раз или более. Это позволит вам передать (например) 4-мерный вектор (четыре числа с плавающей запятой) на один регистр. Система AMD V является примером x86 ABI, который разрешает это.
Другим примером является атрибут GCC типа d64_abi, который сообщает PowerPC о необходимости передавать структуру в регистрах, а не в стеке. (Это часть Darwin ABI ).
typedef struct {
int a;
float f;
char c;
} __attribute__ ((d64_abi)) Thingy;
Thingy foo( Thingy t );
В случае выше, вызов Foo передал бы Thingy в один регистр с плавающей запятой и два регистра int, а не записывал его в стек и снова считывал его обратно. Возвращаемое значение возвращается в регистры таким же образом.
Я никогда не видел компилятор, который делает это автоматически, без вашего ведома, но, возможно, он существует.