в редица

Формат на дефиниция на C ++

Формат на вградена дефиниция

1. Ключовата дума inline се използва за дефиниране на клас от вградени функции, като основната причина е да се използва вместо дефиницията на макрос под формата на израз в C.

изрази във формата на формуляра:

#define expressionname (var1, var2) ((var) + (var2)) * ((var) - (var2)) < / p>

Замяната на този формуляр е както следва:

1. Причината за използването на макродефиницията на define this form е, че езикът C е високоефективен език. Този макрос дефинира във формуляра и използва функция, но е имплементиран с помощта на препроцесора, без параметър стек < B>, код Генерира серия от операции като . Следователно ефективността е висока, което е основна причина да се използва в C.

2. Тази макродефиниция е подобна на функция във формуляра, но когато я използвате, тя е просто замяна в таблицата със символи на предпроцесора, така че не може да бъде открита чрез валидност на параметъра и не може да се насладите на C ++ компилатор строг тип. Предимството на проверката и върнатата стойност също не се налага за преобразуване в конвертируем подходящ тип. По този начин използването му крие редица скрити опасности и ограничения.

3. Въвеждане на контрол на достъпа на класове и класове в C ++, така че ако операция или израз включва член за защита на категория или частен член, не можете да използвате тази дефиниция на макро (защото не можете да поставите този указател. На подходящо място).

4. Целта на Inline също е да замени макро дефиницията на този израз, което елиминира недостатъците на макро дефинициите и наследява предимствата на макро дефинициите.

предварително дефиниран

съответства на 1-3 точки по-горе, както следва:

1. Вградени дефинирани вградени функции, кодът на функцията се поставя в таблицата със символи, като директно я замества директно (като макросът се стартира), няма допълнителни разходи за повикване, ефективността също е висока.

2. Очевидно вградената функция на класа също е реална функция. Когато извиква вградена функция, компилаторът първо ще провери типа на параметрите и ще се увери, че извикването е правилно. След това направете поредица от свързани инспекции, точно както всяка от истинските функции. Това елиминира неговата скрита опасност и ограничения.

3. Inline може да се използва като член на клас, разбира се, може да използва защитен член и частен член на класа.

Когато използвате вградената функция:

Първо, можете да използвате вградената функция, за да замените напълно дефиницията на макрос на формата на формуляра.

Трябва да се отбележи, че вградената функция обикновено е много проста в съдържанието на функцията. Това е така, защото кодът на вградената функция ще бъде разширен навсякъде, където да се извика. Ако функцията е твърде сложна, лошите последици от разширяването на кода вероятно ще увеличат ползите от ефективността. Най-важното място за използване на вградени функции е функцията за достъп за клас.

Функция и предпазни мерки

(1) Функцията на вградената функция

● За вградени функции C ++ може да се използва директно в кода на функцията. Извикването на функцията се нарича вградено внедряване на тялото на функцията.

● За малки функции от само няколко израза, извикването на функцията често е много по-голямо от кода, който е свързан с кода, кодът често е много по-добър от кода на самото съответствие. Ето защо, за такива прости, често използвани малки функции, вградената функция може да подобри оперативната ефективност.

(2) вградена функция за предупреждение

inline

Inline е цената на разширяването на кода и спестява само режийните разходи на извикването на функцията, като по този начин повишава ефективността на функцията. Ако времето на функцията се изпълни, то ще бъде по-малко ефективно от режийните разходи на извикването на функцията. От друга страна, всяка вградена функция се извиква, за да копира кода, което ще увеличи общата сума на общата сума на кода, за да консумира повече място в паметта. Следните случаи не трябва да се използват inline:

1) Ако кодът в тялото на функцията е относително дълъг, използването на inline ще доведе до по-висока консумация на памет.

2) Ако възникне цикъл в тялото на функцията, времето за изпълнение на кода във функцията е по-голямо от служебните разходи на функцията.

Разлика между вградена функция и обща функция

1) Вграденият модификатор е повече от един вграден модификатор от общата функция.

2) Вградената функция е да копира "инкрустирано" в основната функция, което е да постави кода на вградената функция директно върху вътрешната функция, която е различна от общата функция, основната функция Когато общата функция е извикан, това е входен адрес, който инструкцията прескача към извиканата функция. След изпълнение на извиканата функция, инструкциите продължават да изпълняват следния код на основната функция; тъй като вградената функция е кодът на функцията, поставен директно в позицията на функцията, така че няма прескачане на команда и инструкцията се изпълнява в ред.

3) Общият функционален кодов сегмент е само едно копие, поставено на някаква позиция в паметта, когато програмата бъде извикана, инструкцията прескача; когато следващата програма го извика, инструкцията се прескача Come over; вградената функция е няколко вградени функции в програмата и кодът на вградената функция ще копира няколко копия на съответното местоположение

4) Вградената функция обикновено е в дефиницията на главния файл, а общите функции се декларират в заглавните файлове в CPP.

Използване

вградено:

1. Тази функция е дефинирана в класа:

Клас ClassName {

.....

....

int getWidth () {RETURN M_LPICWIDTH;}; // Ако е директно дефинирано в класа, не е необходимо да се променя с inline, компилаторът е автоматизиран до inline функцията

... // Този метод е в "C ++ Primer" The

....

}

2 се споменава. Вградени ключови думи преди class:
 class account {public: Account (double initial_balance) {balance = initial_balance;} // и 1 същия двоен getBalance (); // Деклариране на Double в клас Double Deposit (удвоена сума); частен: двоен баланс;}; вградена двойна сметка :: getBalance () {връщане на баланса;} // Добавяне на вграден ключ Двойна двойна сметка :: Депозиране (Двойна сума);} вградена двойна сметка :: теглене (двойна сума) {връщане (салдо - = сума);} 

Има и някои правила, на които трябва да обърнете внимание: < / p>

1. Inline показва, че това е просто предложение за компилатора и компилаторът може да избере да игнорира това предложение. Например, зададете функция от до 1000 многоредови функции като вградена, компилаторът игнорира тази вградена, възстановете тази функция в нормална функция.

2. При извикване на вградената функция, за да се гарантира, че дефиницията на вградената функция позволява на компилатора да „види“, т.е. дефиницията на вградената функция е в заглавния файл, който е различен от обичайния дефиниция на функцията. Но ако сте свикнали да дефинирате функция в CPP файл или ако искате главният файл да бъде по-сбит, можете да направите това:

 // Someinline.h в 
 #ifndef someinline_h # # Дефиниране на Someinline_hTYPE ПРИМЕР (VOID); // ........ Декларация на други функции #include "someinlie.cpp" // Име на суфикс на изходния файл с компилатора # include " Someinline.h "вграден пример за тип (void) {// .... ......} // ................................................ ................ P> Горният метод е универсален, ефективен, може да се използва с увереност, не е нужно да се притеснявате, че CPP файлът, съдържащ CPP файла в заглавния файл, ще причини грешки при компилиране.

Inline Hook

принцип < /h3>

Inline-hook Чрез модифициране на процеса на функцията, прескача към персонализирания процес, след което се връща към оригиналната функция, за да се гарантира, че системата не се срива, прилага подправяне на логиката на кода. Както е показано на фигура 1:

Първо заменете целевата инструкция с инструкцията за прескачане, адресът за прескачане е компилиран код, който сме написали от него. Този код за сглобяване първо изпълнява кода, зададен от потребителя, като например модифициране на регистъра. Стойност, след това изпълнете заменената оригинална инструкция 2 и накрая се върнете към оригиналната инструкция 3, възстановяване на нормалната работа на програмата.

поток

(1) Конструира инструкцията за прескачане.

(2) Намерете адреса на функцията Hook в паметта и запазете първите 5 байта на мястото на HOOK.

(3) Напишете конструираната инструкция за скок, за да напишете местоположението на КУКАТА.

(4) ще бъде прехвърлен към нашия процес, когато се изпълни от позицията Hook.

(5) Ако искате да изпълните оригиналния процес, отменете куката, тоест възстановете модифицирания байт.

(6) Изпълнете оригиналния процес.

(7) Продължете с Hook, за да живеете в първоначалната позиция.

Related Articles
TOP