Dynaamisesti varatun taulukon koko

cow 02.04.06 13:46

Hae dynaamisesti varatun taulukon koko (GCC)

 Tekstiversio  Arvo: 7 (11 ääntä)  Äänestä: +  -
/*
    Valitettavasti C++-standardi ei sisällä tukea dynaamisesti
    varatun taulukon koon tarkastelulle, mutta taulukon kokoa
    kuitenkin pidetään muistissa muutamassakin paikassa, jotta
    esimerkiksi delete[] osaa vapauttaa oikean määrän muistia.

    Onneksi GCC:n mukavista manuaaleista löytyy informaatiota
    taulukon koon sijainnista. Tässä funktio, joka osaa kaivaa
    tiedon esiin. Inline assembly sekä C++-versiot.

    Koodin todettu toimivan jopa Windowsilla GCC:llä (MinGW) käännettynä.
 */


#include <cstdio>

#define USE_ASM 1

typedef unsigned long ulong_t;
ulong_t array_size(void *t)
{
    int elements = 0;
#if USE_ASM
    asm("pushl -4(%1)\n\t" // push the number into the stack
        "popl %0\n\t"      // pop it to the variable
        :"=r" (elements)   // output registers
        :"r" (t)           // input registers
        :);                // clobbered registers
#else
    struct Array {
        ulong_t elements __attribute__ ((aligned (sizeof (ulong_t))));
    };
    Array *array = reinterpret_cast<Array*>(t);
    --array;
    elements = array->elements;
#endif
    return elements;
}

class Foo { public: ~Foo() { } };
class Bar { public: ~Bar() { } };

int main() {
    Foo *bar = new Foo[42];
    Bar *foo = new Bar[16];
    printf("Number of elements in bar: %ld\n", array_size(bar));
    printf("Number of elements in foo: %ld\n", array_size(foo));
    delete [] bar;
    delete [] foo;
}

/*
    Tulostaa:
    Number of elements in bar: 42
    Number of elements in foo: 16
*/