cstddef library (tsz. cstddef libraries)
<cstddef>
egy szabványos C++ fejlécfájl, amely azokat a típusokat, konstansokat és makrókat biztosítja, amelyek a C nyelv stddef.h
fájljából származnak. Ezek az eszközök főleg alacsony szintű programozáshoz, memóriakezeléshez, mutatók és tömbök kezeléséhez, valamint általános típusdefiníciókhoz szükségesek. A <cstddef>
tehát egy „kapu” az alacsonyabb szintű, platformfüggetlen kódhoz.
<cstddef>
fájlban?
std::size_t
typedef
vagy using
aliasunsigned long
vagy unsigned int
std::size_t n = 10;
int tomb;
for (std::size_t i = 0; i < n; ++i) {
// ...
}
std::ptrdiff_t
typedef
egy előjeles egész típusraint tomb = {1, 2, 3, 4};
std::ptrdiff_t kulonbseg = &tomb - &tomb; // == 2
std::nullptr_t
nullptr
típusának megfelelő típusnullptr
és más típusok közöttvoid f(int*);
void f(std::nullptr_t);
f(nullptr); // Ez a második verziót hívja meg
offsetof(type, member)
#include <iostream>
#include <cstddef>
struct A {
char x;
int y;
};
int main() {
std::cout << offsetof(A, y) << std::endl; // várhatóan 4 vagy 8 (padding függvényében)
}
<cstddef>
?size_t
és ptrdiff_t
biztosítja, hogy kódunk különböző gépeken és fordítókkal is működjön.std::vector
, std::string
, std::array
) belsőleg szinte mindig size_t
típusokat használ méretekhez.unsigned
típusok révén kisebb a negatív indexek vagy túlcsordulás esélye, ha helyesen használjuk.nullptr_t
-val: A nullptr
nem keverhető fel könnyen 0
-val vagy NULL
-lal.
size_t
vs int
: Ha size_t
típusú változókat hasonlítasz össze negatív egész típusokkal (int
), akkor konverziós hibák és meglepetések léphetnek fel.ptrdiff_t
helyett int
: Ha két mutató különbségét int
-be mented, warning
vagy hibás eredmény lehet.
Sablonprogramozásban gyakran látni:
template<typename T>
void f(T* t, std::size_t size) {
for (std::size_t i = 0; i < size; ++i)
process(t);
}
alignof
, alignas
: Bár ezek nem részei <cstddef>
-nek, sokszor együtt szerepelnek vele a memória-alapú trükköknél.
Elem | Leírás |
---|---|
std::size_t
|
Méretek, indexelés, STL kompatibilis típus |
std::ptrdiff_t
|
Mutatók különbsége (előjeles) |
std::nullptr_t
|
nullptr típusa, overloadhoz ideális
|
offsetof()
|
Strukturatag eltolása byte-ban |
A <cstddef>
használata kötelezővé válik, ha sablonos, típusfüggetlen, vagy platformfüggetlen C++ kódot írsz. Ha STL-ben dolgozol, szinte elkerülhetetlen, és alapja sok modern C++ kódbázisnak.