Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС C++. 55 Π²Π΅Ρ€Π½Ρ‹Ρ… способов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ структуру ΠΈ ΠΊΠΎΠ΄ Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор Π‘ΠΊΠΎΡ‚Ρ‚ ΠœΠ°ΠΉΠ΅Ρ€Ρ

try {dm2.std::string::string();} // ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ dm2

catch(…){ // Ссли возбуТдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅,

dm1.std::string::~string(); // Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ dm1

Base::~Base(); // Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

throw; // Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

}

try {dm3.std::string::string();} // ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ dm3

catch(…){ // Ссли возбуТдаСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅,

dm2.std::string::~string(); // Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ dm2

dm1.std::string::~string(); // Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ dm1

Base::~Base(); // Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

throw; // Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

}

}


Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это Π½Π΅ совсСм Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ компилятор, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ компиляторы ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΠΎΠ»Π΅Π΅ слоТным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. И всС ΠΆΠ΅ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ довольно Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ «пустого» конструктора класса Derived. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, насколько Ρ…ΠΈΡ‚Ρ€ΠΎΡƒΠΌΠ½ΠΎ обходится с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ компилятор, конструктор Derived Π΄ΠΎΠ»ΠΆΠ΅Π½, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ конструкторы своих Π΄Π°Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΈ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сами ΠΏΠΎ сСбС ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ встроСнными) ΠΌΠΎΠ³ΡƒΡ‚ свСсти прСимущСства встраивания Π½Π° Π½Π΅Ρ‚.

Π’ΠΎ ΠΆΠ΅ самоС относится ΠΈ ΠΊ конструктору класса Base, поэтому Ссли ΠΎΠ½ встроСнный, Ρ‚ΠΎ вСсь вставлСнный Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠ΄ вставляСтся Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² конструктор Derived (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ конструктор Derived Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструктор Base). И Ссли конструктор класса string Ρ‚ΠΎΠΆΠ΅ окаТСтся встроСнным, Ρ‚ΠΎ Π² конструктор Derived Π΅Π³ΠΎ ΠΊΠΎΠ΄ Π²ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡΡ‚ΡŒ Ρ€Π°Π· – ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· пяти ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² классС Derived строк (Π΄Π²Π΅ унаслСдованныС ΠΈ Ρ‚Ρ€ΠΈ, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π½Π΅ΠΌ самом). НавСрноС, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΌ ясно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΎ встраивании конструктора Derived Π½Π΅ стоит ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ с Π»Π΅Π³ΠΊΠΈΠΌ сСрдцСм. Аналогично обстоят Π΄Π΅Π»Π° ΠΈ с дСструктором класса Derived, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… конструктором.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ встроСнными, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ встроСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли f – встроСнная библиотСчная функция, Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ Π΅Π΅ Ρ‚Π΅Π»ΠΎ Π² свои прилоТСния. Если Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Ρ€Π΅ΡˆΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ f, Ρ‚ΠΎ всС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π΅ использовали, придСтся ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π½ΠΎΠ²ΠΎ. Часто это Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли f Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ρ‚ΠΎ послС Π΅Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ клиСнтскиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ лишь Π·Π°Π½ΠΎΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ. Π­Ρ‚ΠΎ ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ быстрСС, Ρ‡Π΅ΠΌ пСрСкомпиляция, Π° Ссли Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, являСтся динамичСской, Ρ‚ΠΎ измСнСния Π² Π½Π΅ΠΉ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ всС эти сообраТСния, Π½ΠΎ с практичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ сущСствСн ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΊΡ‚: Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ со встроСнными функциями. Π­Ρ‚ΠΎ совсСм Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Как ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ остановки Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ сущСствуСт? Π₯отя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΡ…ΠΈΡ‚Ρ€ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… встраиваниС для ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… вСрсий просто ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ стратСгии Π²Ρ‹Π±ΠΎΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, подходящих для встраивания. ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ ΠΎΡ‚ΠΊΠ°ΠΆΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ вовсС, ΠΈΠ»ΠΈ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡŒΡ‚Π΅ΡΡŒ Ρ‚Π΅ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обязаны Π±Ρ‹Ρ‚ΡŒ встроСнными (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 46) Π»ΠΈΠ±ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Person::age Π²Ρ‹ΡˆΠ΅). ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π΄ΠΎΠ»ΠΆΠ½ΠΎΠΉ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ, Π²Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ, Π½ΠΎ ΠΈ опрСдСляСтС Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π½ΠΈΡŽ ΠΏΠΎΠ΄ΠΎΠ±Π°ΡŽΡ‰Π΅Π΅ мСсто: тонкая оптимизация Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΠ± эмпиричСском ΠΏΡ€Π°Π²ΠΈΠ»Π΅ Β«80–20Β», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ типичная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ 80 % Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° исполнСниС 20 % ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния – ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ 20 % ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ способны ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. МоТно Π΄ΠΎ бСсконСчности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ inline, Π½ΠΎ всС это Π±ΡƒΠ΄Π΅Ρ‚ пустой Ρ‚Ρ€Π°Ρ‚ΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ Π½Π΅ сосрСдоточитС усилия Π½Π° Π½ΡƒΠΆΠ½Ρ‹Ρ… функциях.

Π§Ρ‚ΠΎ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

β€’ Π”Π΅Π»Π°ΠΉΡ‚Π΅ встраиваСмыми Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшиС, часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ, даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ обновлСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ эффСкт «разбухания» ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ быстродСйствиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

β€’ НС ΠΎΠ±ΡŠΡΠ²Π»ΡΠΉΡ‚Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ встроСнными Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ….

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ 31: Π£ΠΌΠ΅Π½ΡŒΡˆΠ°ΠΉΡ‚Π΅ зависимости Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ компиляции

Рассмотрим ΡΠ°ΠΌΡƒΡŽ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π’Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚Π΅ свою ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° C++ ΠΈ вноситС Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ измСнСния Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Π½Π΅ Π² интСрфСйс класса, Π° просто Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹. ПослС этого Π²Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, рассчитывая, Ρ‡Ρ‚ΠΎ это Π·Π°ΠΉΠΌΠ΅Ρ‚ лишь нСсколько сСкунд. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², вСдь Π²Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ всСго ΠΎΠ΄ΠΈΠ½ класс. Π’Ρ‹ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚Π΅ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Build ΠΈΠ»ΠΈ Π½Π°Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ make (Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ эквивалСнт), и… ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ – ΠΏΠΎΠ΄Π°Π²Π»Π΅Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ пСрСкомпилируСтся ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ компонуСтся вСсь ΠΌΠΈΡ€! НС ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ, Π²Π°ΠΌ это скоро надоСст?

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ C++ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ сколько-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ интСрфСйсом ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. Π’ частности, опрСдСлСния классов Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ интСрфСйса, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Ρ†Π΅Π»Ρ‹ΠΉ ряд Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. НапримСр:


class Person {

public:

Person(const std::string& name, const Date& birthday,

const Address& addr);

std::string name() const;

std::string birthDate() const;

std::string address() const;

...

private:

std::string theName; // Π΄Π΅Ρ‚Π°Π»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Date theBirthDate; // Π΄Π΅Ρ‚Π°Π»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

Address theAddress; // Π΄Π΅Ρ‚Π°Π»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

};


Класс Person нСльзя ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ имСя доступа ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ классов, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ рСализуСтся, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ string, Date ΠΈ Address. Π’Π°ΠΊΠΈΠ΅ опрСдСлСния ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ посрСдством Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #include, поэтому вСсьма вСроятно, Ρ‡Ρ‚ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π³ΠΎ класс Person, Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:


#include <string>

#include β€œdate.h”

#include β€œaddress.h”


К соТалСнию, это устанавливаСт зависимости Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ компиляции ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°ΠΉΠ»ΠΎΠΌ опрСдСлСния Person ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. Если измСнится любой ΠΈΠ· этих Ρ„Π°ΠΉΠ»ΠΎΠ² Π»ΠΈΠ±ΠΎ любой ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ зависят, Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ Ρ„Π°ΠΉΠ», содСрТащий ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Person, Π° Ρ€Π°Π²Π½ΠΎ ΠΈ всС Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ класс Person ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚. Π’Π°ΠΊΠΈΠ΅ каскадныС зависимости ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ вСсьма ΠΎΠ±Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

МоТно Π·Π°Π΄Π°Ρ‚ΡŒΡΡ вопросом, ΠΏΠΎΡ‡Π΅ΠΌΡƒ C++ настаиваСт Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса. НапримСр, ΠΏΠΎΡ‡Π΅ΠΌΡƒ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Person ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


namespace std {

class string; // ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π΅ объявлСниС

} // (Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ – см. Π΄Π°Π»Π΅Π΅)

class Date; // ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π΅ объявлСниС

class Address; // ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π΅ объявлСниС

class Person {

public:

Person(const std::string& name, const Date& birthday,

const Address& addr);

std::string name() const;

std::string birthDate() const;

std::string address() const;

...

};


Если Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ класса Person Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ интСрфСйса.

Π£Π²Ρ‹, ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой ΠΈΠ΄Π΅ΠΈ ΠΌΡ‹ наталкиваСмся Π½Π° Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΠ΅Ρ€Π²Π°Ρ: string – это Π½Π΅ класс, Π° typedef (синоним шаблона basic_string<char>). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰Π΅Π΅ объявлСниС string Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ объявлСниС Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, это Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² любом случаС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ части стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ВмСсто этого просто Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ #include ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΡƒΡΠΏΠΎΠΊΠΎΠΉΡ‚Π΅ΡΡŒ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ вряд Π»ΠΈ станут ΡƒΠ·ΠΊΠΈΠΌ мСстом ΠΏΡ€ΠΈ компиляции, особСнно Ссли ваша срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Если Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² всС ΠΆΠ΅ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использования Ρ‚Π΅Ρ… частСй стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

Вторая (ΠΈ Π±ΠΎΠ»Π΅Π΅ сущСствСнная) Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΠΎΡΡ‚ΡŒ, связанная с ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‰ΠΈΠΌ объявлСниСм, состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятору Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΎ врСмя компиляции. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:


int main()

{

int x; // опрСдСляСм int

Person p(params); // опрСдСляСм Person

...

}


Когда компилятор Π²ΠΈΠ΄ΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ x, ΠΎΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ достаточно мСста (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² стСкС) для размСщСния int. НСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ компилятор Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠ²Π° Π΄Π»ΠΈΠ½Π° int. ВстрСчая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ p, компилятор ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ мСсто для Person, Π½ΠΎ ΠΎΡ‚ΠΊΡƒΠ΄Π° Π΅ΠΌΡƒ Π·Π½Π°Ρ‚ΡŒ, сколько ΠΈΠΌΠ΅Π½Π½ΠΎ мСста потрСбуСтся? ЕдинствСнный способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ – ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса, Π½ΠΎ Ссли Π±Ρ‹ Π² опрСдСлСниях классов ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ компилятор выяснил Π±Ρ‹, сколько памяти Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ?