Я не буду сталкиваться с неизменяемыми типами или любой другой языковой семантикой более низкого уровня, так как вы все еще изучаете основы передачи ценностей вокруг, поэтому я отвечу на ваши вопросы как можно более прямыми, и предоставьте вам, чтобы вы спросили своего инструктора больше информации по темам (а также, надеюсь, не путайте вас за тест).
Будет ли ссылка на «умеренный размер» означать, что я использовал бы проход по ссылке для параметров «in» и «in/out», а также используя базовый возврат для значений «out»?
Исходя из контекста того, что вы изучаете сейчас, я бы сказал, нет, что размер, что он ссылается на это sizeof(X)
где X
типа вы передаете в/из.Таким образом, в экземпляре int
, делая стоимость передачи по или пропуском по ссылке не имеет реальных дополнительных расходов памяти или процессорного времени, но если я что-то вроде следующего:
struct SomeLargeStruct {
char SomeChars[1000];
int SomeInts[1000];
double SomeDoubles[1000];
};
sizeof(SomeLargeStruct)
будет довольно большим и нести большое время строительства, если мы проходим по значению (из копии, что это произойдет), например:
void incurACopy(SomeLargeStruct s) { /* do something with s */ }
void giveMeDirect(SomeLargeStruct& s) { /* do something with s */ }
SomeLargeStruct c;
incurACopy(c); // a copy of c is made, lots of data being passed
giveMeDirect(c); // the location of c is passed on the stack, no copy made
Так что для «в» типах, вы даете const type&
заявить в пользователь кода, который передал значение, должен быть действительной ссылкой (т. е. он не должен быть нулевым), а так как это const
мы можем быть уверены, что код, ссылающийся на наш тип, не будет/не может изменять данные, то есть он доступен только для чтения.
Тип «out» равен type&
, поскольку это означает, что значение, переданное в , может быть изменено функцией. Выполнение этого в сравнении с возвратом может быть менее дорогостоящим, если type
- это большой (то есть sizeof
) тип, и есть какие-либо временные элементы, задействованные в возвращаемом типе, в противном случае может не быть большой разницы (вам нужно будет проверить низкий уровень сборка обязательно).
Что касается «в/из» типов, вы могли бы использовать type&
снова, чтобы показать, что значение может быть изменено, хотя эпизодический я видел «в/из» типа чаще называют «необязательными» типами , т. е. тип «вход/выход» может быть необязательным параметром, который имеет значение по умолчанию, если ни один не прошел, в противном случае значение, переданное внутри, имеет влияние, и поэтому может быть изменен.
Редактор может для типов «выход» и «вход/выход», потому что ему будет предоставлен исполнитель функции для документирования того факта, что значение может измениться, другими словами, это возможно они просто забыли поставить const
перед type&
.
Учитывая это, в соответствии с вашим другой вопрос с относительно прототипа, Держу пари, что OUT : double d
и IN/OUT : string d
опечатка, в противном случае, вы всегда можете просто написать 2 прототипы функций:
double foo (const string& a, const C& b, string& d);
double d = foo(x, y, z); // double d ??
и/или
void foo(const string& a, const C& b, double& d, string& s)
{
cout << "IN/OUT string d maybe string s?" << endl;
}
Но чтобы быть в безопасности, вы должны, вероятно, двойная проверка с инструктором (в конце концов, вы не могли бы быть только один борется с этой возможной опечаткой).
Надеюсь, что это поможет и удачи в вашем тесте.
Я полагаю, что переменные с таким же именем являются недосмотром – Tas
Значит, это будет опечатка в обзорном пакете? –