Программчлалын аливаа хэлний үндэс бол өгөгдлийн төрөл байдаг. C++ хэл ч мөн адил, өгөгдлийн төрөл бүрээр хувьсагч (variable) тодорхойлж, түүгээр дамжуулан өгөгдөл хадгалах, тооцоолол хийх боломжтой.

Эдгээр өгөгдлийн төрлүүдийн хадгалах хязгаар (утгын муж) болон санах ойд хэрхэн байрладаг тухай ойлголттой байх нь программчлалын гүн гүнзгий мэдлэг эзэмшихэд маш чухал үндэс болно. Энэ мэдлэг нь зөвхөн хувьсагчийн зөв төрлийг сонгоход туслахаас гадна, санах ой хэмнэх, хурд сайжруулах, мөн программын алдааг олж засах (жишээ нь overflow, memory corruption, alignment issue) зэрэгт маш их хэрэгтэй. Цаашлаад бид бодлого бодох, алгоритм зохиох, системийн түвшний код бичих, эсвэл embedded систем, тоглоомын хөгжүүлэлт зэрэг нарийн шаардлагатай салбаруудад ажиллах үед энэхүү ойлголт бодит давуу тал болж өгдөг.
Өгөгдөл санах ойд хэрхэн хадгалагддаг вэ?
Өмнөх бүлгүүдэд бид хувьсагчийг өгөгдөл хадгалах сав гэж энгийнээр ойлгож ирсэн. Гэхдээ санах ойн зохион байгуулалт, өгөгдлийн төрлийн хэмжээ болон байрлалын тухай ойлголтуудыг судлахаас өмнө бид дараах асуултын хариултыг зайлшгүй мэддэг байх шаардлагатай: “Хувьсагч яг юуг илэрхийлдэг вэ?”
Программчлалын онолын түвшинд авч үзвэл, хувьсагч (variable) гэдэг нь зөвхөн нэртэй сав биш, харин тухайн программ ажиллах явцад санах ойн тодорхой нэг байршлыг зааж буй тэмдэглэгээ юм. Өөрөөр хэлбэл, хувьсагч нь өгөгдлийг хадгалах физик санах ойн хэсэгт оноогдсон логик нэршил бөгөөд уг нэршлээр дамжуулан тухайн байршилд хадгалагдсан мэдээлэлд хандах боломжтой болдог.
Энэ утгаараа хувьсагч нь дараах гурван зүйлээр тодорхойлогдоно:
- Нэр (name): Программ бичигчийн оноосон нэр. Жишээ: age, count, value.
- Төрөл (type): Тухайн хувьсагч ямар төрлийн өгөгдөл хадгалахыг заана (жишээлбэл int, float, char гэх мэт). Энэ нь тухайн өгөгдөлд хэдэн байт зарцуулах, хэрхэн тайлбарлах зэргийг тодорхойлдог.
- Санах ойн хаяг (address): Хувьсагчийн өгөгдөл хадгалагдаж буй RAM дахь физик эсвэл виртуал хаяг.
Хувьсагчийн нэр нь зөвхөн хүний ойлгох хэлбэр бөгөөд компайл хийсний дараа энэ нэр шууд арилж, зөвхөн хаяг (address) ба төрөл (type) л үлддэг. Иймээс бид хувьсагчийг зөв ойлгохын тулд түүний ард ажиллаж буй санах ойн түвшин дэх процессыг гүнзгий ойлгох хэрэгтэй болдог.

Энэ зураг нь програмын санах ойн бүтэц буюу Memory Layout-ийн схем юм. Ихэвчлэн C/C++ хэлээр бичигдсэн програмуудын хувьд ROM ба RAM-д өгөгдөл, код, хувьсагчид хэрхэн хадгалагддагийг дүрслэн харуулжээ.
Хувьсагч бол зүгээр нэг “өгөгдөл хадгалах сав” биш. Энэ нь:
Санах ойн байршил (address)
Тухайн байршил дахь өгөгдлийн утга
Мөн тэр байршилд хандах логик нэршил
гэсэн гурван талт ойлголтын нийлбэр юм. Энэ ойлголт нь бидэнд илүү нарийн бүтэцтэй программ бичих, алдаа олж засах, санах ойг зөв удирдах суурийг бүрдүүлдэг.
Өгөгдлийн төрлийн хэмжээ ба утгын муж
Одоо бид C++ программчлалын хэл дээрх стандарт өгөгдлийн төрлүүдийн талаарх дэлгэрэнгүй хүснэгттэй танилцъя.
ТӨРӨЛ | ХЭМЖЭЭ | УТГЫН МУЖ | ЖИШЭЭ |
---|---|---|---|
char | 1 | -128 → 127 (эсвэл 0 → 255 unsigned) | 0 1 0 0 0 0 0 1 = 65 (‘A’) |
bool | 1 | true (1), false (0) | 0 0 0 0 0 0 0 1 |
short | 2 | -32,768 → 32,767 | |
int | 4 | -2,147,483,648 → 2,147,483,647 | 00000000 00000000 00000000 00000101 = 5 |
unsigned int | 4 | 0 → 4,294,967,295 | |
float | 4 | ~ ±3.4e38 (7 орон нарийвчлал) | IEEE-754: sign |
double | 8 | ~ ±1.7e308 (15 орон нарийвчлал) | IEEE-754 (64 бит) |
long long | 8 | ~ ±9.2e18 |
C++ хэл дээрх өгөгдлийн төрлүүд нь санах ойн тодорхой хэмжээтэй хэсгийг эзэлж, тухайн төрлөөс хамааран өөр өөр хэмжээний утгыг хадгалах боломжтой бөгөөд энэ нь программын гүйцэтгэл, нарийвчлал, санах ойн хэмнэлтэд шууд нөлөөлдөг тул хувьсагчийн төрлийг зөв сонгох нь программчлалын чухал ур чадвар юм.
Иймээс бид дээрх ойлголтуудыг ашиглан цаашид программ бичихдээ ашиглах өгөгдлийн шинж чанар, хэмжээ, нарийвчлалын шаардлага зэргийг харгалзан өгөгдлийн төрлийг зөв оновчтой сонгосноор программын санах ойн хэрэглээг оновчтой зохион байгуулах, гүйцэтгэлийг нэмэгдүүлэх, алдаа гарах магадлалыг бууруулах зэрэг олон чухал давуу талыг бий болгож чадна. Түүнчлэн, өгөгдлийн төрлийн зохистой сонголт нь кодын уншигдах байдал, засварлах хялбар байдалд эергээр нөлөөлж, томоохон төсөл, системийн түвшний программчлалд өндөр чанартай, найдвартай шийдэл боловсруулах үндэс суурь болдог.