C # out параметр, когда возвращаемое значение недействительно - PullRequest
4 голосов
/ 02 апреля 2011

Есть ли польза от этого метода XNA для умножения двух матриц?

public static void Multiply (
     ref Matrix matrix1,
     ref Matrix matrix2,
     out Matrix result
)

Почему результат является выходным параметром, а не возвращается?Есть ли преимущество в скорости или памяти по сравнению с простым возвращаемым значением?Учитывая, что Matrix является структурой, это как-то связано с этим?Я могу понять, почему matrix1 и matrix2 являются переменными ref, поэтому им не нужно их копировать, но я не понимаю, почему третий является выходным параметром, а не возвращаемой или ref-переменной.

Ответы [ 3 ]

7 голосов
/ 02 апреля 2011

Да, важный.Тип Matrix нарушает одно из правил программирования на .NET, структура не должна быть больше 16 байт.Обычно 4 int поля.Матрица имеет 16 полей с плавающей запятой, всего 64 байта.

16-байтовая рекомендация относится к структурам пути, передаваемым в / из метода в сгенерированном машинном коде.Даже ядро ​​x86, особенно нуждающееся в регистрах ЦП, имеет достаточно регистров, чтобы структура могла храниться в регистрах ЦП вместо кадра стека.Однако, если он не подходит, структура пропускается через кадр стека.И копируется как при звонке, так и при получении.Это дорого.То же относится и к возвращаемому значению.

Обходной путь для этих затрат - передать значение структуры по ref или out.Так же, как метод Multiply.Теперь требуется только передача указателя на структуру, 4 байта на 32-битном ядре.Из-за необходимости разыменовывать указатель каждый раз, когда код использует поле структуры.Что хорошо, это необходимо и для объекта класса.

4 голосов
/ 02 апреля 2011

Возможно по той же причине: чтобы его не нужно было копировать (так как это тип значения).Однако я не знаю, может ли компилятор исключить эту копию и при каких обстоятельствах - если это возможно, то это уже уродливый способ делать вещи, которые ничего вам не покупают.

Также продолжайтепомните, что изменяемые типы значений испускают неприятный запах, начиная с .

3 голосов
/ 02 апреля 2011

Да, выигрыш в производительности. Производительность лучше, если учесть, что это тип значения, а если сделать его параметром out, он будет маршалироваться от вызываемого обратно к вызывающему.

Ознакомьтесь с замечаниями для OutAttribute и Blittable и Non-Blittable типов .

...