static array (tsz. static arrays)
static
kulcsszóra utal (bár azzal is kombinálható), hanem arra, hogy a méret és a memóriafoglalás nem változik futás közben.
T típusú_tömb_neve;
int
, double
, char
, stb.)
int szamok; // 5 elemű egész számokat tároló tömb
A tömb elemei inicializálhatók deklaráláskor:
int szamok = {1, 2, 3, 4, 5};
Ha kevesebb értéket adunk meg, mint a tömb mérete, a maradék elemek 0-ra (alapértelmezett értékre) lesznek inicializálva:
int szamok = {1, 2}; // szamok..szamok = 0
Ha a méretet nem adjuk meg explicit, a fordító azt az initializer listából származtatja:
int szamok = {1, 2, 3, 4, 5}; // automatikusan 5 elemű lesz
A statikus tömb stack-en (veremmemóriában) kerül lefoglalásra (ha nem használjuk a static
kulcsszót).
Ha static
kulcsszóval deklaráljuk, akkor a tömb data segment-ben (adat szegmens) vagy BSS szegmensben helyezkedik el, és a program teljes élettartama alatt létezik.
Példa:
static int szamok; // program teljes futása alatt létezni fog
A tömb elemei indexeléssel érhetők el, nullától kezdődően:
szamok = 10;
int x = szamok;
Fontos: nincs automatikus bounds checking (határvizsgálat). Ha szamok
-öt próbálsz elérni, az undefined behavior (nem definiált viselkedés).
for (int i = 0; i < 5; i++) {
std::cout << szamok << std::endl;
}
for (int ertek : szamok) {
std::cout << ertek << std::endl;
}
A tömb méretét (elem számát) fordítási időben ki tudjuk számolni:
int meret = sizeof(szamok) / sizeof(szamok);
sizeof(szamok)
→ az egész tömb bájtban mért méretesizeof(szamok)
→ egyetlen elem bájtban mért mérete
Statikus tömb | Dinamikus tömb (pl. new vagy std::vector )
|
---|---|
Mérete fix (fordítási időben ismert) | Mérete futásidőben is változhat |
Stack-en vagy data segment-ben tárolódik | Heap-en tárolódik |
Gyors allokáció, kis overhead | Lassabb allokáció, nagyobb overhead |
Nincs bounds checking | Pl. std::vector esetén van (opcionális)
|
Statikus tömböt általában akkor használunk, ha:
Példák:
const char* napok = {"Hetfo", "Kedd", "Szerda", "Csutortok", "Pentek", "Szombat", "Vasarnap"};
C++-ban statikus tömb lehet többdimenziós is.
Példa 2D tömbre:
int matrix; // 3 sor, 4 oszlop
Inicializálás:
int matrix = {
{1, 2, 3},
{4, 5, 6}
};
Elem elérés:
matrix = 42; // 2. sor 3. elem
Iterálás:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
std::cout << matrix << " ";
}
std::cout << std::endl;
}
static
kulcsszó jelentése tömb eseténHa a tömböt függvényen belül static
-ként deklaráljuk:
void f() {
static int tomb;
}
tomb
nem a stacken, hanem a data segment-ben lesz.Példa:
void szamlalo() {
static int count = 0;
count++;
std::cout << count << std::endl;
}
Indexelési hiba:
szamok
→ nem létezik, mivel az indexelés 0..4-ig tart.Elfelejtett inicializálás:
Túl nagy stack tömb:
stack overflow
hibát okozhat.Pl.:
int nagyTomb; // veszélyes, inkább dinamikus tömb kellene
std::array
C++11-től a std::array
az STL-ből egy jobb alternatíva statikus tömb helyett:
#include <array>
std::array<int, 5> szamok = {1, 2, 3, 4, 5};
Előnyök:
.size()
, .at()
, .begin()
, .end()
, stb..at()
esetén
Előnyök | Hátrányok |
---|---|
Egyszerű, gyors | Méret fix |
Stacken gyorsan elérhető | Bounds checking hiánya |
Nagyon kis overhead | Nehézkes átadni függvényeknek (átalakul pointerré) |
Könnyen inicializálható | Nagy tömb stack overflow-hoz vezethet |
Ha flexibilitás kell → std::vector
vagy std::array
jobb választás.