Убудаваны прататып функцыі супраць чарговай дэкларацыі супраць прататыпа

У чым розніца паміж инлайн функцыі і затым асноўным чынам:

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;
}
3
магчыма дублікат C ++ инлайн функцыі - таксама см гэты адказ шахтавай .
дададзена аўтар Kerrek SB, крыніца
Магчыма, вы мелі на ўвазе куб (5); ?
дададзена аўтар log0, крыніца
Я павінен так.
дададзена аўтар log0, крыніца

4 адказы

<Код> убудаваны функцыя можа быць вызначана ў некалькіх адзінках трансляцыі (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);
}

Прататып дазваляе паведаміць кампілятару, што функцыя будзе існаваць падчас кампаноўкі, нават калі ён не існуе зусім яшчэ. Гэта дазваляе асноўным для выкліку функцыі, нават калі ён яшчэ не існуе. Як правіла, прататыпы знаходзяцца ў загалоўках, так і іншыя адзінкі кампіляцыі могуць выклікаць функцыю, ня вызначаючы яго самі. Гэта самае хуткае час кампіляцыі, а функцыя лёгка выкарыстоўваць з іншых адзінак кампіляцыі.

//cube.h
double cube(double);

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

double cube(double side)
{
   return side * side * side;
}
6
дададзена
Выдатна і вельмі зразумела тлумачэнне, сэр/мэм. Вялікі дзякуй!
дададзена аўтар iggy2012, крыніца
не апошні прыклад не вызначана паводзіны без якой-дыягностыкі патрабуецца, калі cube.h ўключаецца абодвума cube.cpp і іншы адзінкі перакладу. Функцыя можа не быць убудаваны у адным блоку і ня инлайн ў іншы.
дададзена аўтар M.M, крыніца
У другім прыкладзе гэта будзе добрая практыка, каб адзначыць гэтую функцыю ў якасці ўнутранай сувязі, каб пазбегнуць выпадковага нявызначанага паводзінаў у выпадку якой-небудзь іншая частка праекта таксама робіць функцыю куб
дададзена аўтар M.M, крыніца
<Я> ... можа быць вызначана ў адной адзінкі кампіляцыі (CPP файл + ўключае ў сябе) некалькі разоў - Вы мелі на ўвазе адзінкі розных кампіляцыі?
дададзена аўтар anatolyg, крыніца
@MooingDuck: anatolyg правоў: убудаваны функцыя можа быць вызначана <я> толькі адзін раз у адзінцы трансляцыі, нават калі яно можа быць вызначана некалькі раз у праграме, не парушаючы ODR.
дададзена аўтар David Rodríguez - dribeas, крыніца
Не, убудаваны дазволена парушаць ODR, як шаблоны. У адваротным выпадку было б цяжка паставіць убудаваны ў загалоўку, і калі б гэта было не ў загалоўку, дурныя складальнікі не маглі ўбудоўваць яго!
дададзена аўтар Mooing Duck, крыніца
Ах, так, я гэта няправільна. Забывалі аб ўключаюць ахову.
дададзена аўтар Mooing Duck, крыніца
@ M.M: Фіксаваны дадатковы убудаваны ў апошнім узоры, дзякуй. Вы маеце рацыю аб унутранай сувязі, але гэта дадатковая складанасць, якая не супер Релевента да адказу.
дададзена аўтар Mooing Duck, крыніца
Чаму гэта не прынята ў якасці адказу я задаюся.
дададзена аўтар Felype, крыніца

З пункту гледжання прадукцыйнасці, яны ўсё адно, так як инлайн гэта проста падказка для кампілятара. Калі падзел дэкларацыі/вызначэння выкарыстоўваецца і вызначэнне на іншы адзінцы трансляцыі, то гэта будзе складаней кампілятар ўбудоўваць яго (але ёсць рэалізацыі, якія робяць так).

Розніца са стварэннем функцыі убудаваны ці не ў тым, што кампаноўнік не будзе скардзіцца, калі ён бачыць тое ж самае вызначэнне инлайн для функцыі больш чым адзін раз.

1
дададзена

Праграма 3 кампіляваць сапраўды гэтак жа з г ++ -S -O3 $ file.cc . для другога прыкладу, дзе вызначэнне двайны кубы (двайны бок) ўсё яшчэ існуе ў ня ўбудаванай форме, хоць ўбудавальныя ў Int асноўнага() За выключэннем.

_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
дададзена
Розніца, што вы адзначаеце гэта дэталь рэалізацыі, некаторыя кампілятары будуць генераваць усе функцыі заўсёды, нават калі ён на самай справе ўбудавальныя, таму што вы маеце права атрымаць адрас элемента рядного функцыі, і кампілятар не можа ведаць пры апрацоўцы функцыі, калі пазней у тым жа TU адрас гэтай функцыі будзе прапанавана.
дададзена аўтар David Rodríguez - dribeas, крыніца
@David Роўна.
дададзена аўтар log0, крыніца

Пры аб'яўленні функцыі убудаванага кампілятар спрабуе паскорыць код больш ці менш капіюючы цела функцыі, дзе яна называецца. Гэта ўсяго толькі здагадка, і гэта капіяванне кампілятара, каб прыняць рашэнне аб, калі гэта магчыма.

Я не ўпэўнены, што будзе адбывацца ў 3-м прыкладзе. Я мяркую, што гэта будзе залежаць ад ланцуга інструмента выкарыстоўваецца.

0
дададзена
Апошні з іх з'яўляецца проста прататып функцыі перад галоўным (). Усе яны, здаецца, працуюць сапраўды гэтак жа, але я, здаецца, не разумеюць, у чым розніца.
дададзена аўтар iggy2012, крыніца