Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
JęzykC++,będącpotomkiemC,bardzopoważniepodchodzidozasa-
dydarmowejabstrakcjiibezpośredniegoodwzorowanianasprzęt.Tozobo-
wiązaniewykraczapozafunkcjejęzykaCobsługiwaneprzezC++.Wszystkie
elementy,którezostałydodanedojęzykaC++iktórenieistniejąwC,wtym
nowefunkcjejęzykowe,działajązgodniezpowyżejprzytoczonymizasada-
mi,awyjątkoweodstępstwadokonywanebardzocelowo.Wrzeczywistości
niektórefunkcjeC++powodująpowstaniejeszczemniejszegoobciążenia
niżodpowiednikodjęzykaC.Jednymztakichprzykładówjestsłowoklu-
czoweconstexpr.Nakazujeonokompilatorowiwyznaczyćwyrażeniewczasie
kompilacji(jeślitomożliwe),jakpokazanowprogramienalistingu1.
#include<cstdio>
constexprintisqrt(intn){
inti:1;
while(i*i<n)++i;
returni-(i*i!:n);
}
intmain(){
constexprintx:isqrt(1764);
printf("%d",x);
}
Listing1.Programilustrującyużyciesłowakluczowegoconstexpr
Funkcjaisqrtobliczapierwiastekkwadratowyargumentun.Począwszyod
wartości1,funkcjazwiększazmiennąlokalnąidomomentu,wynikwyra-
żeniai*ibędziewiększylubrównyn.Jeślii*i::n,zwracai;wprzeciwnym
raziezwracai-1.Zauważ,żewywołanieisqrtzawieraliterał,więckompila-
tormożeteoretycznieobliczyćwynikzaCiebie.Będziemiałontylkojedną
wartość.
Skompilowanieprogramuzlistingu1zapomocąkompilatoraGCC8.3,
wktórymjakoplatformędocelowąwybranox86-64zopcją-O2,dajewwyniku
kodasemblerazaprezentowanynalistingu2.
.LC0:
.string"%d"
main:
sub
rsp,8
mov
esi,42
mov
edi,OFFSETFLAT:.LC0
xor
eax,eax
call
printf
xor
eax,eax
add
rsp,8
ret
Listing2.Kodasemblerauzyskanyposkompilowaniuprogramuzlistingu1
xxxviiiWstępdlaprogramistówC