2016-02-17 4 views
0

У меня есть тест, и я хотел бы получить некоторые пояснения по двум вопросам, касающимся параметров.Параметры In, Out, In/Out

В моих записях говорится, что рекомендуемый способ передать параметр в функцию будет использовать «пройти по ссылке»

const type& x; // for "in" parameters 
    type& x; // for "out"(to read) and "in/out"(to read/write) parameters 

Он также утверждает, для дополнительной оптимизации, мы можем пройти «в» параметрах по значению, и мы можем также передать переменную out по ссылке вместо простого возврата.

По вопросу обзора я пытаюсь ответить заявляет

Предположим, что все типы «умеренной» размер: Не используйте оптимизации малого значения или оптимизации большого значения.

Будет ли ссылка на «умеренный размер» означать, что я бы использовал проход по ссылке для параметров «in» и «in/out», а также используя базовый возврат для значений «out»?

Более того, возникает вопрос, что прошу создать функцию прототипа (без тела), который имеет следующее:

В: строке, C B
OUT: двойной д
В/OUT: строка d

double foo (const string& a, const C& b, string& d) 

является то, что я прямо сейчас, но я не уверен, как справиться с OUT и IN/OUT, так как они получают такое же имя. Правильно ли я предположить, что ссылка на строку может быть передана в функцию и функцию как Штодт() используются для для создания возвращения типа двойного, которые могут быть сохранены в вызывающей функции, как

double val = foo(x,y,z) 
+1

Я полагаю, что переменные с таким же именем являются недосмотром – Tas

+0

Значит, это будет опечатка в обзорном пакете? –

ответ

1

Я не буду сталкиваться с неизменяемыми типами или любой другой языковой семантикой более низкого уровня, так как вы все еще изучаете основы передачи ценностей вокруг, поэтому я отвечу на ваши вопросы как можно более прямыми, и предоставьте вам, чтобы вы спросили своего инструктора больше информации по темам (а также, надеюсь, не путайте вас за тест).

Будет ли ссылка на «умеренный размер» означать, что я использовал бы проход по ссылке для параметров «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; 
} 

Но чтобы быть в безопасности, вы должны, вероятно, двойная проверка с инструктором (в конце концов, вы не могли бы быть только один борется с этой возможной опечаткой).

Надеюсь, что это поможет и удачи в вашем тесте.

+1

@ 5gon12eder, touché :) Я отредактировал, чтобы удалить это, спасибо! – txtechhelp

Смежные вопросы