Hvordan fungerer sizeof(arr) / sizeof(arr[0])?

Hvordan fungerer sizeof(arr) / sizeof(arr[0])?

Hvis du har en array derefter sizeof(array) returnerer antallet af bytes arrayet optager. Da hvert element kan tage mere end 1 byte plads, skal du dividere resultatet med størrelsen af ​​et element (sizeof(array[0]) ). Dette giver dig antallet af elementer i arrayet.

Eksempel:

std::uint32_t array[10];

auto sizeOfInt = sizeof(std::uint32_t); // 4
auto numOfBytes = sizeof(array); // 10*sizeOfInt = 40
auto sizeOfElement = sizeof(array[0]); // sizeOfInt = 4
auto numOfElements = sizeof(array) / sizeof(array[0]); // numOfBytes / sizeOfElement = 40 / 4 = 10

LIVE EKSEMPEL

Bemærk, at hvis du sender et array til en funktion, vil ovenstående ikke virke, da arrayet henfalder til en pointer og sizeof(array) returnerer størrelsen på markøren.

std::size_t function(std::uint32_t a[]) // same for void function(std::uint32_t a[10])
{
    return sizeof(a); // sizeof(std::uint32_t*)!
}

std::uint32_t array[10];
auto sizeOfArray = function(array); // array decays to a pointer inside function()

LIVE EKSEMPEL #2


Som det er beskrevet i C++ Standard (5.3.3 Sizeof)

I dette udtryk

sizeof(arr) / sizeof(arr[0])

der bruges to underudtryk med operatorstørrelsen.

Dette underudtryk

sizeof(arr)

giver antallet af bytes optaget af array arr (Jeg formoder, at arr er et array).

For eksempel hvis du erklærede et array som

int arr[10];

så skal compileren reservere hukommelse til at indeholde 10 elementer af typen int. Hvis for eksempel sizeof( int ) er lig med 4, vil compileren reservere 10 * 4 =40 bytes hukommelse.

Underudtryk

sizeof(arr[0])

angiver antallet af bytes optaget af et element i arrayet. Du kan bruge et hvilket som helst indeks som f.eks.

sizeof(arr[1000])

fordi udtrykket ikke er evalueret. Det er kun vigtigt størrelsen i bytes af objektet (et element i arrayet), der bruges inde i operatoren.

Så hvis du kender det samlede antal bytes, der var reserveret til et array

sizeof(arr)

og ved hvor mange bytes hvert element i arrayet optager (alle elementer i et array har samme størrelse), så kan du beregne antallet af elementer i arrayet ved at bruge formlen

sizeof(arr) / sizeof(arr[0])

Her er et simpelt forhold. Hvis du har en matrix af N elementer af typen T

T arr[N];

og du kender størrelsen af ​​hukommelsen optaget af arrayet, så kan du beregne størrelsen af ​​dets element ved at bruge formel

sizeof( arr ) / N == size of an element of the array. 

Og omvendt

Hvis du kender størrelsen af ​​hukommelsen optaget af arrayet og størrelsen af ​​dets element, kan du beregne antallet af elementer i arrayet

sizeof( arr ) / sizeof( a[0] ) == N - number of elements in the array

Det sidste udtryk kan du også omskrive på følgende måde

sizeof( arr ) / sizeof( T ) == N - number of elements in the array

fordi elementerne i arrayet har type T, og hvert element i arrayet optager nøjagtigt det antal bytes, der kræves for at allokere et objekt af typen T.

Vær opmærksom på, at begyndere normalt laver en sådan fejl. De sender en matrix som et argument til en funktion. Lad os for eksempel antage, at du har en funktion

void f( int a[] )
{
   // ...
}

Og du går videre til funktionen dit array

int arr[10];
f(arr);

så bruger funktionen markøren til det første element i arrayet. Faktisk har funktionen erklæring

void f( int *a )
{
   // ...
}

Så hvis du for eksempel skriver indenfor funktionen

void f( int *a )
{
   size_t n = sizeof( a ) / sizeof( a[0] );
   // ...
}

derefter som a i funktionen er en pointer (det er ikke et array), så får du noget lignende

void f( int *a )
{
   size_t n = sizeof( int * ) / sizeof( int );
   // ...
}

Normalt størrelsen af ​​en pointer svarende til enten 8 eller 4 bytes afhængigt af det anvendte miljø. Og du får ikke antallet af elementer. Du vil få noget mærkeligt værdi.


Det virker kun hvis arr er ikke blevet henfaldet til en pointer, det vil sige, det er en matrixtype, ikke en pointertype.

sizeof(arr) er den samlede størrelse optaget af arrayet.

sizeof(arr[0]) er størrelsen af ​​det første element i arrayet. (Bemærk, at arrays med nul længde ikke er tilladt i C++, så dette element eksisterer altid, hvis selve arrayet eksisterer).

Da alle elementer vil være af samme størrelse, er antallet af elementer sizeof(arr) / sizeof(arr[0]) .