linjassa

C ++ -määrittelymuoto

tekstin sisäinen määritelmämuoto

1. Inline-avainsanaa käytetään määrittämään rivin sisäisten funktioiden luokka, jonka esittelyssä tärkein syy on käyttää se C:n lausekkeen muodossa olevan makromääritelmän sijaan.

lausekkeet lomakkeen muodossa:

#define lausekkeennimi (muuttuja1, muuttuja2) ((muuttuja) + (muuttuja2)) * ((muuttuja) - (muuttuja2)) < / p>

Korvaa tämä lomake seuraavasti:

1. Syy tämän lomakemakromääritelmän käyttöön johtuu siitä, että C-kieli on tehokas kieli. Tämä makro määrittää muodossa ja käyttää funktiota, mutta se on toteutettu esiprosessorilla ilman parametripinoa < B>, koodi Luo joukon toimintoja, kuten . Siksi tehokkuus on korkea, mikä on tärkein syy sen käyttöön C.

2. Tämä makromäärittely on samanlainen kuin muodon funktio, mutta sitä käytettäessä se on vain yksinkertainen korvaus esiprosessorin symbolitaulukossa, joten sitä ei voida havaita parametrin kelvollisuuden perusteella, eikä se voi nauttia C:stä. ++ kääntäjän tiukka tyyppi. Tarkistuksen etua ja palautusarvoa ei myöskään pakoteta muuttamaan vaihdettavaan sopivaan tyyppiin. Tällä tavalla sen käytöllä on joukko piilotettuja vaaroja ja rajoituksia.

3. Otetaan käyttöön luokkien ja luokkien käyttöoikeus C ++:ssa, jotta jos toiminto tai lauseke sisältää kategorian suojausjäsenen tai yksityisen jäsenen, et voi käyttää tätä makromääritelmää (koska et voi laittaa tätä osoitinta. sopivassa paikassa).

4. Inlinen tarkoitus on myös korvata tämän lausekkeen makromääritelmä, joka eliminoi makromääritelmien haitat ja perii makromääritelmien edut.

ennalta määritetty

vastaa 1-3 pistettä edellä seuraavasti:

1. Inline määritellyt rivifunktiot, funktion koodi sijoitetaan symbolitaulukkoon, korvaa sen suoraan (kuten makro käynnistetään), ei puhelua, tehokkuus on myös korkea.

2. On selvää, että luokan sisäinen funktio on myös todellinen funktio. Kun inline-funktiota kutsutaan, kääntäjä tarkistaa ensin parametrien tyypin ja varmistaa, että kutsu on oikea. Tee sitten sarja asiaan liittyviä tarkastuksia, aivan kuten mikä tahansa todellisista toiminnoista. Tämä eliminoi sen piilotetut vaarat ja rajoitukset.

3. Inlinea voidaan käyttää luokan jäsenenä, voi tietysti käyttää luokan suojajäsentä ja yksityistä jäsentä.

Kun käytät tekstin sisäistä toimintoa:

Ensinnäkin voit korvata lomakkeen muodon makromääritelmän kokonaan tekstinsisäisellä funktiolla.

On huomattava, että tekstin sisäinen funktio on yleensä vain hyvin yksinkertainen funktion sisällössä. Tämä johtuu siitä, että inline-funktion koodia laajennetaan missä tahansa paikassa, jossa sitä kutsutaan. Jos toiminto on liian monimutkainen, koodin laajentamisen pahat seuraukset todennäköisesti lisäävät tehokkuuden etuja. Sisäisten funktioiden tärkein käyttöpaikka on luokan pääsytoiminto.

Toiminto ja varotoimet

(1) Sisäisen funktion toiminto

● Inline-funktioissa C ++:a voidaan käyttää suoraan funktiokoodissa. Funktion kutsua kutsutaan funktion rungon sisäiseksi käyttöönotoksi.

● Pienillä vain muutaman lauseen funktioilla funktion kutsu on usein paljon suurempi kuin koodiin liittyvä koodi, koodi on usein paljon parempi kuin itse vastaavuuden koodi. Siksi tällaisten yksinkertaisten, usein käytettyjen pienten toimintojen inline-toiminto voi parantaa toiminnan tehokkuutta.

(2) varoitustoiminto

Inline on koodin laajennuksen hinta, ja se säästää vain funktiokutsun lisäkustannuksia, mikä lisää funktion tehokkuutta. Jos funktion aika suoritetaan, se on vähemmän tehokas kuin funktiokutsun yläraja. Toisaalta kutakin rivifunktiota kutsutaan kopioimaan koodi, mikä lisää koodin kokonaismäärää kuluttaakseen enemmän muistitilaa. Seuraavissa tapauksissa ei tule käyttää tekstiä:

1) Jos funktion rungossa oleva koodi on suhteellisen pitkä, rivin käyttö lisää muistin kulutusta.

2) Jos funktion rungossa esiintyy silmukka, koodin suorittamisaika funktiossa on suurempi kuin funktion yläraja.

Rivifunktion ja yleisen funktion ero

1) Sisäänrakennettu muuntaja on enemmän kuin yksi rivimuuttaja kuin yleinen funktio.

2) Inline-toiminto on kopioida "inlaid" päätoimintoon, joka on sijoittaa upotetun funktion koodi suoraan sisäfunktioon, joka eroaa yleisestä funktiosta, päätoiminto Kun yleinen toiminto on kutsutaan, se on syöttöosoite, jonka käsky hyppää kutsuttuun funktioon. Kutsutun toiminnon suorittamisen jälkeen käskyt jatkavat seuraavan koodin suorittamista päätoiminnolle; koska rivifunktio on funktion koodi Sijoitettu suoraan funktion paikkaan, joten komentohyppyä ei ole ja käsky suoritetaan järjestyksessä.

3) Yleinen toimintokoodisegmentti on vain yksi kopio, joka on sijoitettu johonkin paikkaan muistissa, kun ohjelmaa kutsutaan, käsky hyppää; kun seuraava ohjelma kutsuu sitä, käsky hyppää. Tule yli; inline-funktio on muutama ohjelman sisäinen funktio, ja inline-funktion koodi kopioi useita kopioita vastaavasta sijainnista

4) Inline-funktio on yleensä head-tiedoston Definition-osassa, ja yleiset funktiot ilmoitetaan CPP:n otsikkotiedostoissa.

Käyttö

rivissä:

1. Tämä funktio on määritelty luokassa:

Luokan nimi {

.....

....

int getWidth () {RETURN M_LPICWIDTH;}; // Jos määritetään suoraan luokassa, ei tarvitse muokata inline-toiminnolla, kääntäjä on automatisoitu inline-funktioon

... // Tämä menetelmä on "C ++ Primer" -ohjelmassa

....

}

2 mainitaan. Upotetut avainsanat ennen luokkaa:
 luokan tili {julkinen: Tili (double aloitussaldo) {saldo = alkuperäinen_saldo;} // ja 1 sama double getBalance (); // Ilmoita tuplaus luokassa Double Talletus (kaksinkertainen summa); yksityinen: kaksinkertainen saldo;}; inline Kaksoistili :: getBalance () {palautussaldo;} // Lisää Inline Key Double Double Account :: Talletus (kaksinkertainen summa);} inline kaksoistili :: nosto (kaksinkertainen summa) {palautus (saldo - = summa);} 

Myös joitain sääntöjä on kiinnitettävä huomiota: < / p>

1. Inline näyttää, että se on vain ehdotus kääntäjälle, ja kääntäjä voi jättää tämän ehdotuksen huomioimatta. Jos esimerkiksi määrität funktion, jossa on enintään 1000 monirivistä funktiota inline-muodossa, kääntäjä jättää tämän inline-toiminnon huomioimatta, palauta tämä funktio normaaliksi funktioksi.

2. Inline-funktiota kutsuttaessa varmista, että tekstinsisäisen funktion määritelmä antaa kääntäjälle "nähdä" eli inline-funktion määritelmä on otsikkotiedostossa, joka eroaa tavallisesta funktion määritelmä. Mutta jos olet tottunut määrittämään funktion CPP-tiedostossa tai jos haluat päätiedoston olevan tiiviimpi, voit tehdä tämän:

 // Someinline.h in 
 #ifndef someinline_h # # Määrittele Someinline_hTYPE EXAMPLE (VOID); // ........ Muiden funktioiden ilmoitus #include "someinlie.cpp" // Lähdetiedoston jälkiliitteen nimi kääntäjällä # include " Someinline.h "inline-tyyppiesimerkki (tyhjä) {// .... ......} // ................................................ ................ P> Yllä oleva menetelmä on universaali, tehokas, sitä voidaan käyttää luottavaisin mielin, ei tarvitse huolehtia siitä, että CPP-tiedosto, joka sisältää CPP-tiedoston otsikkotiedostossa, aiheuttaa käännösvirheitä.

Inline Hook

-periaate < /h3>

Inline-hook Muokkaamalla toimintoprosessia, hyppää mukautettuun prosessiin ja sitten takaisin alkuperäiseen toimintoon varmistaaksesi järjestelmän Älä romahda, toteuta koodilogiikan peukalointi. Kuten kuvassa 1:

Korvaa ensin kohdekäsky hyppykäskyyn, hyppyosoite on sen kirjoittama käännöskoodi. Tämä kokoonpanokoodi suorittaa ensin käyttäjän määrittämän koodin, kuten rekisterin muokkaamisen. Arvo, suorita alkuperäinen ohje 2 korvattu, ja lopuksi hyppää takaisin alkuperäiseen ohjeeseen 3, palauttaa ohjelman normaalin toiminnan.

flow

(1) Muodostaa hyppykäskyn.

(2) Etsi Hook-toiminnon osoite muistista ja tallenna 5 ylintä tavua HOOK-paikkaan.

(3) Kirjoita rakennettu hyppykäsky kirjoittaaksesi KOUKUN sijainnin.

(4) siirretään prosessiimme, kun koukku-asema suorittaa sen.

(5) Jos haluat suorittaa alkuperäisen prosessin, peruuta koukku, eli palauta muokattu tavu.

(6) Suorita alkuperäinen prosessi.

(7) Jatka Koukun elämää alkuperäisessä asennossa.

Related Articles
TOP