Количества стеки используется на 32-разрядном процессоре x86 для передачи аргументов различных типов:
- байты: 4 байта
- BOOL: 4 байта
- перечисления: 4 байта
- символ: 4 байта
- короткий: 4 байта
- INT: 4 байта
- длиной: 8 б ytes
- поплавка: 4 байта
- дважды: 8 байт
- десятичное: 16 байт
- структура: размер выполнения структуры
- строка: 4 байта
- массив: 4 байта
- объект: 4 байта
- интерфейс: 4 байта
- указатель: 4 байта
- экземпляр класса: 4 байта
Те ниже линии являются ссылочными типами, их размер будет в два раза с 64-разрядным процессором.
Для вызова статического метода первые 2 аргумента, которые содержат до 4 байтов, будут передаваться через регистры CPU, а не в стек. Для вызова метода экземпляра только один аргумент будет передаваться через регистры. Остальные передаются в стеке. 64-разрядный процессор поддерживает передачу 4 аргументов через регистры.
Как видно из списка, единственный раз, когда вы должны рассмотреть возможность передачи аргумента ref, для структур. Нормальное руководство для этого состоит в том, чтобы сделать это, когда структура больше 16 байт. Не всегда легко угадать размер времени выполнения структуры, обычно до 4 полей. Меньше, если эти поля являются двойными, длинными или десятичными. Поэтому это руководство обычно рекомендует превратить вашу структуру в класс именно по этой причине.
Также обратите внимание на то, что не сэкономит, передавая аргумент как байтовый или короткий намеренно, int - это тип, которым удовлетворяет 32-разрядный процессор. То же самое для доступных в настоящее время 64-разрядных процессоров.
Возвращаемое значение метода, реальная тема вашего вопроса почти всегда возвращается в регистр CPU. Большинство типов удобно встраиваются в регистры eax или edx: eax, регистр FPU для значений с плавающей запятой. Единственными исключениями являются большие структуры и десятичные числа, они слишком велики, чтобы соответствовать регистру. Они вызываются путем резервирования пространства в стеке для возвращаемого значения и передачи 4-байтового указателя на это пространство в качестве аргумента для метода.
Я думаю, вы сбиты с толку; вы бы возвращали ссылку на большой массив, а не на массив ... –
Stadard .Net массивы уже являются ссылочными типами. – Dykam