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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС STLΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 21

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

β€’ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ строки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ символы, нСпосрСдствСнно входящиС Π² строку.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ string ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ:

β€’ ΠΊΠΎΠΏΠΈΡ распрСдСлитСля памяти. Π’ совСтС 10 рассказано, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΠΎΠ»Π΅ Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. Π’Π°ΠΌ ΠΆΠ΅ описаны странныС ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ распрСдСлитСли памяти.

Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string, основанныС Π½Π° подсчСтС ссылок, Ρ‚Π°ΠΊΠΆΠ΅ содСрТат:

β€’ ΡΡ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ содСрТимого.

Π’ Ρ€Π°Π·Π½Ρ‹Ρ… рСализациях string эти Π΄Π°Π½Π½Ρ‹Π΅ хранятся ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Для наглядности ΠΌΡ‹ рассмотрим структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string. Π’ Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного, всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ позаимствованы ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСнных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ STL. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎΠ½ΠΈ оказались ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ, попавшимися ΠΌΠ½Π΅ Π½Π° Π³Π»Π°Π·Π°.

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ string содСрТит копию своСго распрСдСлитСля памяти, Ρ€Π°Π·ΠΌΠ΅Ρ€ строки, Π΅Π΅ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ со счСтчиком ссылок (RefCnt) ΠΈ содСрТимым строки. Π’ этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ string, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ стандартный Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ памяти, Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° большС памяти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ. ΠŸΡ€ΠΈ использовании нСстандартного указатСля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ string увСличится Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° распрСдСлитСля.

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ содСрТат ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру. ΠŸΡ€ΠΈ этом Ρ‚Π°ΠΊΠΆΠ΅ прСдполагаСтся использованиС стандартного распрСдСлитСля памяти. Как ΠΈ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A, ΠΏΡ€ΠΈ использовании нСстандартного распрСдСлитСля Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° string увСличиваСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° распрСдСлитСля. Благодаря ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π² этом Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, Π½ΠΎ Π½Π΅ прСдусмотрСнной Π² Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ A, использованиС стандартного распрСдСлитСля обходится Π±Π΅Π· Π·Π°Ρ‚Ρ€Π°Ρ‚ памяти.

Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, хранится Ρ€Π°Π·ΠΌΠ΅Ρ€ строки, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ ΠΈ счСтчик ссылок, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ содСрТимым строки. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ хранятся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, относящиСся ΠΊ синхронизации доступа Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… систСмах. К нашСй Ρ‚Π΅ΠΌΠ΅ ΠΎΠ½ΠΈ Π½Π΅ относятся, поэтому Π½Π° рисункС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π° Β«ΠŸΡ€ΠΎΡ‡Π΅Π΅Β».

Π‘Π»ΠΎΠΊ Β«ΠŸΡ€ΠΎΡ‡Π΅Π΅Β» оказался большС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я постарался Π²Ρ‹Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π± изобраТСния. Если ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π²Π΄Π²ΠΎΠ΅ большС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π²Π΄Π²ΠΎΠ΅ большС памяти. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ… синхронизации ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² ΡˆΠ΅ΡΡ‚ΡŒ Ρ€Π°Π· ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ указатСля.

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° string всСгда Ρ€Π°Π²Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ указатСля, Π½ΠΎ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ всСгда ссылаСтся Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, содСрТащий всС Π΄Π°Π½Π½Ρ‹Π΅ строки: Ρ€Π°Π·ΠΌΠ΅Ρ€, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ, счСтчик ссылок ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ содСрТимоС. РаспрСдСлитСли уровня ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π’ Π±ΡƒΡ„Π΅Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ хранятся Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ возмоТности совмСстного доступа ΠΊ содСрТимому; эта Ρ‚Π΅ΠΌΠ° здСсь Π½Π΅ рассматриваСтся, поэтому ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ Π½Π° рисункС ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ Π±ΡƒΠΊΠ²ΠΎΠΉ Β«XΒ» (Ссли вас интСрСсуСт, Π·Π°Ρ‡Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ с подсчСтом ссылок, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ совСту 29 Β«More Effective C++Β»).

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ D ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π² сСмь Ρ€Π°Π· большС памяти, Ρ‡Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (ΠΏΡ€ΠΈ использовании стандартного распрСдСлитСля памяти). Π’ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подсчСт ссылок Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ string содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π΄ΠΎ 15 символов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, нСбольшиС строки хранятся нСпосрСдствСнно Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ string β€” данная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½ΠΎΠ³Π΄Π° называСтся Β«ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ°Π»Ρ‹Ρ… строк». Если Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ строки ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 15 символов, Π² Π½Π°Ρ‡Π°Π»Π΅ Π±ΡƒΡ„Π΅Ρ€Π° хранится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТатся символы строки.

Π― помСстил здСсь эти Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ совсСм Π½Π΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒ читатСля Π² своСм ΡƒΠΌΠ΅Π½ΠΈΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ исходныС тСксты ΠΈ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ красивыС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ. По Π½ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° string ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Π²ΠΈΠ΄Π°

string s("Perse"); // Имя нашСй собаки - ΠŸΠ΅Ρ€ΡΠ΅Ρ„ΠΎΠ½Π°, Π½ΠΎ ΠΌΡ‹

                   // ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ просто "ΠŸΠ΅Ρ€ΡΠΈ"

Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ D обходится Π±Π΅Π· динамичСского выдСлСния памяти, обходится ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π² рСализациях A ΠΈ C ΠΈ двумя β€” Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B (для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ string, ΠΈ для символьного Π±ΡƒΡ„Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² этом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅). Если для вас сущСствСнно количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ выдСлСния/освобоТдСния ΠΈΠ»ΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ памяти, часто связанныС с этими опСрациями, ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B Π»ΡƒΡ‡ΡˆΠ΅ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ подальшС. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ синхронизации доступа Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ эта рСализация ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для Π²Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A ΠΈ C, Π° количСство динамичСских Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ памяти ΡƒΠΉΠ΄Π΅Ρ‚ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ»Π°Π½. РСализация D Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ многопоточности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΉ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ подсчСт ссылок. Π—Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ строками с подсчСтом ссылок ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 13. Випичная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° многопоточности Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°Ρ… STL описана Π² совСтС 12.

Π’ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, основанной Π½Π° подсчСтС ссылок, всС Π΄Π°Π½Π½Ρ‹Π΅, находящиСся Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° string, ΠΌΠΎΠ³ΡƒΡ‚ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ string (ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ содСрТимоС), поэтому ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ рСализация A ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ мСньшими возмоТностями для совмСстного использования Π΄Π°Π½Π½Ρ‹Ρ…. Π’ частности, Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ B ΠΈ C Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ совмСстноС использованиС Π΄Π°Π½Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ Смкости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ этих Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅: отсутствиС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ распрСдСлитСлСй уровня ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это СдинствСнная рСализация с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ использования ΠΎΠ±Ρ‰ΠΈΡ… распрСдСлитСлСй: всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ распрСдСлитСлСм! (Π—Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ распрСдСлитСлСй ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ΡΡŒ ΠΊ совСту 10.) РСализация D Π½Π΅ позволяСт совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… string.

Один ΠΈΠ· интСрСсных аспСктов повСдСния string, Π½Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ нСпосрСдствСнно ΠΈΠ· этих Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ, относится ΠΊ стратСгии выдСлСния памяти для ΠΌΠ°Π»Ρ‹Ρ… строк. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях устанавливаСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмого Π±Π»ΠΎΠΊΠ° памяти; ΠΊ ΠΈΡ… числу ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A, C ΠΈ D. ВСрнСмся ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅

string s ("Perse"); // Π‘Ρ‚Ρ€ΠΎΠΊΠ° s состоит ΠΈΠ· 5 символов

Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмого Π±ΡƒΡ„Π΅Ρ€Π° Ρ€Π°Π²Π΅Π½ 32 символам. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя Ρ€Π°Π·ΠΌΠ΅Ρ€ s Π²ΠΎ всСх рСализациях Ρ€Π°Π²Π΅Π½ 5 символам, Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ этого ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ A Ρ€Π°Π²Π½Π° 31 (Π²ΠΈΠ΄ΠΈΠΌΠΎ, 32-ΠΉ символ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ для Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½ΡƒΠ»ΡŒ-символа, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ c_str). Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C Ρ‚Π°ΠΊΠΆΠ΅ установлСн ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, Ρ€Π°Π²Π½Ρ‹ΠΉ 16, ΠΏΡ€ΠΈ этом мСсто для Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½ΡƒΠ»ΡŒ-символа Π½Π΅ рСзСрвируСтся, поэтому Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ s Ρ€Π°Π²Π½Π° 16. ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ D Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π²Π΅Π½ 16, Π½ΠΎ с Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ мСста для Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½ΡƒΠ»ΡŒ-символа. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ D Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ содСрТимоС строк Π΅ΠΌΠΊΠΎΡΡ‚ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΅ 16 символов хранится Π² самом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ string. РСализация B Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ выдСляСмого Π±Π»ΠΎΠΊΠ°, ΠΈ Π² Π½Π΅ΠΉ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ s Ρ€Π°Π²Π½Π° 7. (ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ 6 ΠΈΠ»ΠΈ 5? НС знаю. ΠŸΡ€ΠΎΡΡ‚ΠΈΡ‚Π΅, я Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» исходныС тСксты.)

Из сказанного ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ слСдуСт, Ρ‡Ρ‚ΠΎ стратСгия выдСлСния памяти для ΠΌΠ°Π»Ρ‹Ρ… строк ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ, Ссли Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с большим количСством ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… строк ΠΈ (1) Π² вашСй Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ срСдС Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти ΠΈΠ»ΠΈ (2) Π²Ρ‹ ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ возмоТности Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылки ΠΈ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки Π² минимальном количСствС страниц памяти.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ string Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ большСй ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ свободы, Ρ‡Π΅ΠΌ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ эта свобода ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами. НиТС пСрСчислСны ишь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹.

β€’ ΠŸΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ содСрТимому string ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ (ΠΈΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ) подсчСт ссылок. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях подсчСт ссылок Π²ΠΊΠ»ΡŽΡ‡Π΅Π½, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдоставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ прСпроцСссорного макроса). Π’ совСтС 13 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ спСцифичСской ситуации, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ подсчСта ссылок, Π½ΠΎ такая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. НапримСр, подсчСт ссылок экономит врСмя лишь ΠΏΡ€ΠΈ частом ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ строк. Если Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ строки ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ, Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° подсчСт ссылок Π½Π΅ ΠΎΠΏΡ€Π°Π²Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ.

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π² 1-7 (ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅) Ρ€Π°Π· большС памяти, Ρ‡Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ char*.

β€’ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° string ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ нуля, ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ динамичСского выдСлСния памяти.

β€’ ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ string ΠΌΠΎΠ³ΡƒΡ‚ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΈ Смкости строки.