| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Dynaamisesti varatun taulukon kokocow 02.04.06 13:46 Hae dynaamisesti varatun taulukon koko (GCC)
/* 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 */ |
![]() Haku
|