Клас на съхранение Спецификаторите

Standard C поддържа четири съхранение клас спецификатор:

Стандарти S89 и C99 синтаксис на удобство твърдят, че typedef - памет квалификационен клас. Въпреки това, typedef не е правилното спецификатор. Повече typedef разглежда книга.






спецификатор ученик

Преди да се пристъпи към разглеждане на спецификатор ученик. Тя трябва да се справят накратко с програмата за оформление. В С, при промяна на променливите връзки може да се използва един от трите автомати: вътрешна, външна, или които не принадлежат към всеки от тези видове. (В последния случай не се прилагат разпоредбите редактирате връзки към него.) Като цяло, имената на функции и глобални променливи, използвани външна връзка. Това означава, че след като оформлението те ще бъдат на разположение на всички файлове, които правят програмата. Обектите, декларирани с спецификаторът статично, който се вижда на ниво файл, вътрешно свързване се полага след като оформление, те ще бъдат на разположение в рамките на файла, в който са декларирани само. За да не се прилага, а оттам локална променлива задължителен, те са достъпни само в рамките на техните единици.

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

Спецификаторът ученик играе важна роля в програми, състоящи се от много файлове. Програмата на езика С, може да бъде записан в няколко файла, които се събират отделно и след това сглобени в една единица. В този случай, трябва по някакъв начин да кажа на всички файлове на глобалните променливи на програмата. Най-добрият (и най-преносими) начин да направите това - да се определят (описват) всички глобални променливи в един файл и да ги обявят пред ученик спецификатор в други файлове, както е показано на фиг. 2.1.

Фиг. 2.1. Използването на глобални променливи в отделно компилирани модули

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

спецификатор статично

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

Местните статични променливи

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






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

Статично локална променлива може да се инициализира. Тази стойност се определя на него само веднъж - в началото на програмата, но не всеки път, когато се програмира на блока, както обикновено локална променлива. В следващия вариант на серия функция () статичен локална променлива се инициализира с номер 100:

Глобални статични променливи

Следният пример илюстрира прилагането на статично глобална променлива. Тук последователност генератор брой променен така, че първоначалната номер, даван като се обадите на друга функция, series_start ():

series_start () с някои число повикване като генератор параметър инициализира серия (). След това, последователност от числа може да бъде генериран от серия множествена повикване ().

Общ преглед. Имена на статични локални променливи са видими само в рамките на блока, в който са декларирани; имена на глобалните статични променливи са видими само в рамките на файла, в който са декларирани.

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

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

спецификатор регистър

Първоначално регистър клас съхранение Спецификаторът се прилага само за променливи от тип Int. Чар и да указатели. Въпреки това, на стандарта с разширяване на използването на регистъра на квалификант. Сега той може да се прилага за всеки тип променлива.

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

регистър Спецификаторът на идентификация значително разширен. S89 и C99 стандарти просто да декларират "достъп до обекта, възможно най-бързо." Почти по същото характер и цели числа са все още поставя в регистър. Разбира се, най-големи обекти (като например масиви), не могат да бъдат поставени в регистър, но компилаторът е инструктиран да "се грижи" за скоростта на операциите с тях. В зависимост от конкретното изпълнение на променливите на компилатора и да се регистрирате на операционната система се обработват по различен начин. Понякога се регистрирате спецификатор просто се игнорира и променливата се третира както обикновено, но на практика това се случва рядко.

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

Обикновено в регистрите на процесора може да се постави най-малко две променливи от тип Чар или вътр. Въпреки това, в различни програмни среди режими за оптимизация може да бъдат много различни, така че изборът на оптимизация режим следва да се прилага, като се вземат предвид характеристиките на конкретен компилатор.


[1] Синоними: определяне. дефиниция.