C++ definiční formát
inline definiční formát
1. Inline klíčové slovo se používá k definování třídy inline funkcí. Hlavním důvodem je jeho zavedení it Místo definice makra ve formě výrazu v C.
výrazy ve tvaru:
#define název výrazu (var1, var2) ((var) + (var2)) * ((var) - (var2)) < / p>
Nahraďte tento formulář takto:
1. Důvodem použití definice makra formuláře je, že jazyk C je vysoce výkonný jazyk. Toto makro definuje ve formuláři a používá funkci, ale je implementováno pomocí preprocesoru, bez zásobníku parametrů < B>, kód Generuje řadu operací, jako je . Proto je účinnost vysoká, což je hlavní důvod, proč se používá v C.
2. Tato definice makra je podobná funkci ve formuláři, ale při jejím použití jde pouze o jednoduchou náhradu v tabulce symbolů pre-procesoru, takže ji nelze detekovat podle platnosti parametru a nelze ji použít v C ++ přísný typ kompilátoru. Výhoda kontroly a návratová hodnota také není vynucena převodem na konvertibilní vhodný typ. Tímto způsobem má jeho použití řadu skrytých nebezpečí a omezení.
3. Zavedení řízení přístupu tříd a tříd v C++, takže pokud operace nebo výraz zahrnuje člena ochrany kategorie nebo soukromého člena, nemůžete použít tuto definici makra (protože nemůžete umístit tento ukazatel. Na vhodném místě).
4. Účelem Inline je také nahradit makrodefinici tohoto výrazu, která odstraňuje nevýhody makrodefinic a přebírá výhody makrodefinic.
předdefinováno
odpovídá 1–3 bodům výše, a to následovně:
1. Inline definované inline funkce, kód funkce je umístěn v tabulce symbolů a přímo jej nahrazuje (jako je spuštěno makro), žádná režie volání, efektivita je také vysoká.
2. Je zřejmé, že inline funkce třídy je také skutečnou funkcí. Při volání inline funkce kompilátor nejprve zkontroluje typ parametrů a zajistí, že volání je správné. Poté proveďte řadu souvisejících kontrol, stejně jako kterákoli ze skutečných funkcí. Odpadá tak jeho skryté nebezpečí a omezení.
3. Inline lze použít jako člena třídy, samozřejmě lze použít ochranu člena a soukromého člena třídy.
Při použití funkce inline:
Nejprve můžete pomocí funkce inline plně nahradit definici makra formuláře formuláře.
Je třeba poznamenat, že inline funkce je obecně pouze velmi jednoduchá v obsahu funkce. Je to proto, že kód vložené funkce bude rozbalen na libovolném místě, aby bylo možné ji zavolat. Pokud je funkce příliš složitá, špatné důsledky rozšíření kódu pravděpodobně zvýší výhody efektivity. Nejdůležitějším místem použití pro inline funkce je funkce přístupu pro třídu.
Funkce a bezpečnostní opatření
(1) Funkce vložené funkce
● Pro inline funkce lze C ++ přímo použít v kódu funkce Volání funkce se nazývá inline nasazení těla funkce.
● U malých funkcí pouze s několika příkazy je volání funkce často mnohem větší než kód, který souvisí s kódem, kód je často mnohem lepší než samotný kód korespondence. Proto pro takové jednoduché, časté používání a časté malé funkce může inline funkce zlepšit provozní efektivitu.
(2) funkce upozornění na řádku
alt="inline" alt
Inline je cena za rozšíření kódu a šetří pouze režii volání funkce, čímž zvyšuje efektivitu funkce. Pokud se provede čas funkce, bude méně efektivní než režie volání funkce. Na druhou stranu je každá inline funkce volána ke zkopírování kódu, což zvýší celkové množství celkového množství kódu, aby se spotřebovalo více místa v paměti. Následující případy by neměly používat inline:
1) Pokud je kód v těle funkce relativně dlouhý, bude mít použití inline za následek vyšší spotřebu paměti.
2) Pokud se v těle funkce vyskytne smyčka, je čas na provedení kódu ve funkci delší než režie funkce.
Rozdíl mezi inline funkcí a obecnými funkcemi
1) Inline modifikátor je více než jeden inline modifikátor než obecná funkce.
2) Inline funkce je zkopírovat "inlaid" do hlavní funkce, což je umístit kód inline funkce přímo na vnitřní funkci, která se liší od obecné funkce, hlavní funkce Když je obecná funkce volaná, je to vstupní adresa, na kterou instrukce skočí na volanou funkci. Po provedení volané funkce instrukce pokračují v provádění následujícího kódu na hlavní funkci; protože inline funkce je kód funkce umístěn přímo na pozici funkce, takže nedochází k žádnému skoku příkazu a instrukce se provádí v pořadí.
3) Segment kódu obecné funkce je pouze jedna kopie umístěná na nějaké pozici v paměti, když je zavolán program, instrukce skočí; když ji zavolá další program, instrukce je přeskočena Come over; inline funkce je několik inline funkcí v programu a kód inline funkce zkopíruje několik kopií odpovídajícího umístění
4) Inline funkce je obecně v definici head souboru a obecné funkce jsou deklarovány v hlavičkových souborech v CPP.
Použití
inline:
1. Tato funkce je definována ve třídě:
ClassName ClassName {
.....
....
int getWidth () {RETURN M_LPICWIDTH;}; // Pokud je přímo definováno ve třídě, není třeba jej upravovat pomocí inline, kompilátor je automatizován na funkci inline
... // Tato metoda je v "C ++ Primer" The
....
}
2 je zmíněno. Klíčová slova vložená před třídou:class account {public: Account (double initial_balance) {balance = initial_balance;} // a 1 stejný double getBalance (); // Declare Double in class Double Deposit (dvojitá částka); private: double balance;}; inline Double account :: getBalance () {return balance;} // Add Inline Key Double Double Account :: Deposit (Double volume);} Inline double account :: select (double part) {return (zůstatek - = částka);}
Existují také některá pravidla, kterým je třeba věnovat pozornost: < / p>
1. Inline ukazuje, že je to pouze návrh pro kompilátor a kompilátor se může rozhodnout tento návrh ignorovat. Například zadáte funkci až 1000 víceřádkových funkcí jako inline, kompilátor tuto inline ignoruje, obnovte tuto funkci do normální funkce.
2. Při volání inline funkce se ujistěte, že definice inline funkce umožňuje kompilátoru "vidět", to znamená, že definice inline funkce je v hlavičkovém souboru, což se liší od obvyklého definice funkce. Ale pokud jste zvyklí definovat funkci v souboru CPP nebo pokud chcete, aby byl soubor head stručnější, můžete to udělat:
// Someinline.h in
#ifndef someinline_h # # Definujte Someinline_hTYPE EXAMPLE (VOID); // ........ Deklarace dalších funkcí #include "someinlie.cpp" // Název přípony zdrojového souboru s kompilátorem # include " Someinline.h "příklad typu inline (void) {// .... ......} // ...................................... ................ P> Výše uvedená metoda je univerzální, efektivní, lze ji používat s jistotou, nemusíte se bát, že soubor CPP obsahující soubor CPP v hlavičce způsobí chyby při kompilaci.Inline Hook
Princip< /h3>
Inline-hook Úpravou procesu funkce přeskočíte na vlastní proces, pak skočíte zpět na původní funkci, abyste zajistili, že se systém nezhroutí, implementujte falšování logiky kódu. Jak je znázorněno na obrázku 1:
Nejprve nahraďte cílovou instrukci instrukcí skoku, adresa skoku je kompilovaný kód, který jsme jí napsali. Tento kód sestavení nejprve spustí kód určený uživatelem, jako je úprava registru. Hodnotu, poté proveďte nahrazenou původní instrukci 2 a nakonec skočte zpět na původní instrukci 3, čímž obnovíte normální provoz programu.
flow
(1) Vytvoří instrukci skoku.
(2) Najděte v paměti adresu funkce háku a uložte prvních 5 bajtů do umístění HOOK.
(3) Napište vytvořenou instrukci skoku pro zapsání umístění HOOK.
(4) bude přenesen do našeho procesu, když bude proveden pozicí Hook.
(5) Pokud chcete provést původní proces, zrušte zavěšení, tj. obnovte upravený bajt.
(6) Proveďte původní proces.
(7) Pokračujte s Hookem, aby žil v původní poloze.