Кіріспе

Бірлік оператор

sizeof – C және C++ бағдарламалау тілдеріндегі бірлік оператор. Ол өрнектің немесе дерек типінің жадта алатын көлемін анықтайды, бұл көлем char өлшем бірліктерінің санымен өлшенеді. Сәйкесінше, `sizeof(char)` конструкциясының нәтижесі міндетті түрде 1 болады. `char` типінің нақты биттерінің саны стандарттық кіріспе файлы `limits.h`-де анықталған, алдын ала өңдеуші макросы арқылы көрсетіледі. Көптеген қазіргі заманғы есептеу платформаларында бұл сегіз битті құрайды. `sizeof` операторының нәтижесі әдетте `size_t` деп белгіленетін, таңбасы жоқ бүтін сан типі болып табылады.

Оператордың бір операнды болады, ол өрнек немесе дерек типінің түрлендірілуі, яғни скобкалардың ішінде жазылған дерек типі. Дерек типтері тек бүтін сандар мен қалқыма нүктелер сияқты қарапайым типтер ғана емес, сонымен қатар көрсеткіш типтері және күрделі дерек типтері (одақтар, құрылымдар және C++ сыныптары) болуы мүмкін.

Толық емес түрлері

sizeof тек "толық" анықталған типтерге ғана қолданылуы мүмкін. Массивтерде бұл массивтің өлшемдері оның жариялануында көрсетілуі керек және элементтерінің типі толық анықталған болуы тиіс. Құрылымдар мен біріктірулер үшін бұл толық анықталған типтердің мүшелер тізімі болуын білдіреді. Мысалы, келесі екі бастапқы файлды қарастырайық: Екі файл да C тілінде толыққанды заңды, және кодта arr және -ға sizeof қолданылуы мүмкін. Дегенмен, кодта мұны жасау заңсыз, өйткені -дағы анықтамалар толық емес. arr жағдайында код массивтің өлшемін көрсетпейді; бұл ақпарат болмаса, компилятор массивте неше элемент бар екенін біле алмайды және массивтің жалпы көлемін есептей алмайды. Сол сияқты, компилятор -тың көлемін есептей алмайды, өйткені ол оның қандай мүшелерден тұратынын білмейді, сондықтан құрылым мүшелерінің (және толтырудың) өлшемдерінің қосындысын есептей алмайды. Егер бағдарламашы массивтің өлшемін -да көрсетсе, немесе оның мүшелер тізімін ұсыну арқылы -тың анықтамасын толықтырса, онда сол бастапқы файлда arr немесе -қа sizeof қолдануға болады.

Нысан мүшелері

C++11 кластың нақты мүшелерінің өлшемін анықтау үшін sizeof параметрін пайдалану мүмкіндігін ұсынды, бұл үшін объектіні құру қажет емес. Мысалы, төмендегі мысал көптеген платформаларда сәйкес нәтиже береді.

Түрлі үлгілер топтамалары

C++11 вариативті үлгілерді енгізді; sizeof кілт сөзінен кейін эллипсис параметрлік жинақтағы элементтердің санын береді.

Іске асыру

Белгілі бір ұзындығы бар дерек типіне немесе айнымалыға қолданғанда, sizeof операторы бар өрнектер бағдарлама құрастырылу кезінде есептеледі; олар тұрақты нәтиже мәндерімен алмастырылады. C99 стандарты өзгермелі ұзындығы бар массивтерді (VLA) енгізді, бұл бағдарлама орындалу кезінде мұндай өрнектерді есептеуді қажет етті. Көп жағдайда, іске асыру ерекшеліктері платформаның қолданбалық бинарлық интерфейсі (ABI) құжатында сипатталуы мүмкін, онда компилятор сәйкес келуі тиіс дерек типтерінің форматтары, толтыру және туралану көрсетіледі.

Құрылымның төсеніші

Кез келген нысан түрінің мөлшерін есептегенде компилятор тиімділік немесе архитектуралық шектеулерді қанағаттандыру үшін қажетті дерек құрылымын туралауды ескеруі керек. Көптеген компьютерлік архитектуралар сөз мөлшеріне бөлінбейтін кез келген байт мекенжайынан басталатын көп байттық қол жеткізуді қолдамайды, тіпті архитектура рұқсат берген жағдайда да, процессор көбінесе жадыда бірнеше сөзді алып жатқан нысанға қарағанда сөз бойынша тураланған нысанды жылдамрақ ала алады. Сондықтан компиляторлар дерек құрылымдарын кем дегенде сөз шекарасына туралайды, сондай-ақ жеке мүшелерін тиісті шекараларына туралайды. Мысалда, студент құрылымы сөз шекарасында орналасуы мүмкін, және мүшелік бағасы осы шекарадан басталады, ал мүшелік жасы келесі сөз мекенжайынан басталуы мүмкін. Компилятор мүшелер арасына қажет болған жағдайда төсем байттарды қосып, туралау талаптарын орындайды. Құрылым массивтің элементе ретінде қолданылса, дұрыс туралауды қамтамасыз ету үшін құрылым соңында төсем байттар болуы мүмкін. Осылайша, C-дегі құрылымның жалпы мөлшері оның жеке мүшелерінің мөлшерінің қосындысынан артық болуы мүмкін. Мысалы, көптеген жүйелерде келесі кодты басып шығарады: