2013-03-11 4 views
2

Учитывая две функции:C++ передача параметров массива против отдельных элементов

int foo(int, int); 

и

int bar(int*); 

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

Действительно ли «лучше» взять прежний подход над последним?

+5

У вас есть массив? Затем передайте его как массив. У вас есть отдельные значения? Передайте его как отдельные значения. –

+0

Если вы хотите избежать создания массива просто для передачи двух аргументов функции, то да, первая предпочтительнее. –

ответ

1

Одним из недостатков, с которыми я могу думать, является int bar(int*), так это то, что это может затруднить перегрузку. Например:

int areaOfRectangle(int width, int height); 
int areaOfRectangle(int x1, int y1, int x2, int y2); 

все в порядке, но как вы собираетесь это делать с массивами?

int areaOfRectangle(int* widthHeight); 
int areaOfRectangle(int* coordinates); // error 

, приведенный выше, не будет собирать, потому что int areaOfRectangle(int*) не может быть объявлена ​​/ определена дважды.

Кроме того, если вы просто используете массив как способ произвольной группировки параметров, вы делаете свой код труднее читать и использовать. Сравните:

int calculateIncome(int normalHours, 
        int overtimeHours, 
        int normalRate 
        int overtimeRate); // Self documenting 

int calculateIncome(int* parameters); // How do I use this function? 

int calculateMean(int* numbers); // Parameters are logically grouped, 
           // so array makes sense 

Третий вопрос (который Санчо описывает в своем ответе) является то, что int bar(int*) опасно. Что происходит, когда пользователь вызывает вашу функцию меньшим массивом, чем тот, который вы ожидали? С другой стороны, вызов int Foo(int, int) с неправильным количеством параметров не будет скомпилирован.

2

Да, прежний подход int foo(int, int); может проверять параметры во время компиляции. int bar(int*) необходимо сделать предположения о переданном массиве.

3

Это зависит от того, что вы подразумеваете под «лучше»: если передача нескольких параметров лучше согласована с логической структурой вашей программы, то, безусловно, намного лучше для чтения возможность передавать несколько параметров. Хороший тест на то, может ли это иметь место, - это спросить, могут ли отдельные элементы массива получить индивидуальное имя. Если ответ «да», то отдельные параметры лучше. Сохранение нескольких байтов здесь и там при прохождении параметров не компенсирует даже незначительную потерю удобочитаемости.

0

Это зависит от того, «лучше» является:

  1. Для лучшей производительности:

    1 Если массив имеет только несколько элементов (скажем, менее 6 параметра, зависит от целевого процессора и доступные регистры могут использоваться для передачи параметров), метод foo() лучше, поскольку вся переменная может проходить по регистру; и foo может непосредственно получить значение из регистра. В то время как для бара требуется разыменование указателя.

    2 Если массив имеет более 10 элементов. Лучше передавать с помощью указателей, так как у этого есть меньше операций стека, чтобы нажать параметр в верхней части стека.

  2. Для уменьшения ошибки: метод foo() лучше, поскольку для метода bar() элементы могут быть изменены инструкциями в баре, которые могут быть видны после возврата из bar(), и это может вызвать если вы не выполняете операции с элементами в bar().

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