Встроенный прототип функции против регулярного объявления против прототипа - PullRequest
3 голосов
/ 28 октября 2011

В чем разница между встроенной функцией и основной, так:

inline double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

против простого объявления функции, например:

double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

против прототипа функции?

double cube(double);

int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}

Ответы [ 4 ]

6 голосов
/ 28 октября 2011

Функция inline может быть определена в нескольких единицах перевода (файл cpp + включает в себя) и является подсказкой компилятору для включения функции. Обычно он помещается в заголовок, который увеличивает время компиляции, но может привести к более быстрому коду. Это также позволяет использовать функцию из многих модулей компиляции.

//cube.h
inline double cube(double side)
{
   return side * side * side;
}

//cube.cpp
int main( )
{
    cube(5);
}

Регулярное его определение - это обычный метод, когда он (обычно) определяется в файле cpp и связан с ним. Его нелегко использовать из других модулей компиляции.

//cube.cpp
double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}

Прототип позволяет вам сообщить компилятору, что функция будет существовать во время компоновки, даже если она еще не существует. Это позволяет main вызывать функцию, даже если она еще не существует. Обычно прототипы находятся в заголовках, поэтому другие модули компиляции могут вызывать функцию, не определяя ее сами. Это самое быстрое время компиляции, и эта функция легко используется из других модулей компиляции.

//cube.h
double cube(double);

//cube.cpp
int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}
1 голос
/ 28 октября 2011

3 программы компилируются точно так же с g++ -S -O3 $file.cc. За исключением второго примера, где определение double cube(double side) все еще существует в не встроенной форме, хотя в int main()

_main:
pushl   %ebp
movl    $16, %eax
movl    %esp, %ebp
subl    $8, %esp
andl    $-16, %esp
call    __alloca
call    ___main
leave
xorl    %eax, %eax
ret
1 голос
/ 28 октября 2011

С точки зрения производительности, они все одинаковы, поскольку inline - всего лишь подсказка для компилятора.Если используется разделение объявления / определения, а определение находится в другой единице перевода, компилятору будет сложнее его встроить (но есть реализации, которые это делают).

Разница с созданиемфункция inline или нет заключается в том, что компоновщик не будет жаловаться, если он видит одно и то же встроенное определение для функции более одного раза.

0 голосов
/ 28 октября 2011

Когда вы объявляете встроенную функцию, компилятор пытается ускорить код, более или менее копируя тело функции туда, где она вызывается.Это всего лишь предложение, и компилятор должен принять решение, если это возможно.

Я не уверен, что произойдет в третьем примере.Я предполагаю, что это будет зависеть от используемой цепочки инструментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...