C 174  167 152 Bytes
Rekursive Funktion f, die Speicher verliert ( 152 ):
#include"object.h"
size_t f(array_t*a){size_t t=0,i=0;for(;i<array_length(a);i++){object_t*o=array_get_copy(a,i,0);t+=o->type==6?f(o->ary):1;}return t;}
Rekursiv, fdas unter Verwendung von Referenzen bei 167 nicht leckt :
#include"object.h"
size_t f(array_t*a){size_t t=0,i=0;for(;i<array_length(a);i++){object_t**o=array_get_ref(a,i,0);t+=*o->type==t_array?f(*o->ary):1;}return t;}
Ungolfed:
size_t get_recursize (const array_t* const a) {
  pfn();
  object_failnull(a);
  size_t out = 0;
  for (size_t i = 0; i < array_length(a); i++) {
    object_t** o = array_get_ref(a, i, NULL);
    if ( (*o)->type == t_array ) {
      out += get_recursize((*o)->ary);
    } else {
      ++out;
    }
  }
  return out;
}
"Aber wie", fragen Sie, "kann dies in C beantwortet werden? Sicherlich gibt es in C keine verwalteten Arrays, und Sie können wirklich keine heterogenen Arrays haben ...?"
"Aha", erwidere ich, "denn ich habe an einem einfachen System von" Objekten "für (GNU-ish) C11 und ISO C ++ 11 gearbeitet".
Das vollständige Demo-Programm für diese Funktion ist: 
#include "../calc/object/object.h"
size_t get_recursize (const array_t* const a);
define_array_new_fromctype(ssize_t);
int main (void) {
  size_t len = 6;
  static const ssize_t h[6] = { -1, 3, -5, 7, -9, 11 };
  array_t* a = array_new_from_ssize_t_lit(h, len, t_realint);
  size_t rsize = get_recursize(a);
  printf("Recursive size of a: %zu\n", rsize);
  object_t* asobj = object_new(t_array, a);
  array_destruct(a);
  array_t* b = array_new(NULL, -1);
  for (size_t j = 0; j < 10; j++) {
    array_append(b, asobj);
  }
  object_destruct(asobj);
  rsize = get_recursize(b);
  printf("Recursive size of b: %zu\n", rsize);
  asobj = object_new(t_array, b);
  array_destruct(b);
  array_t* c = array_new(NULL, -1);
  for (size_t i = 0; i < 100; i++) {
    array_append(c, asobj);
  }
  object_destruct(asobj);
  rsize = get_recursize(c);
  printf("Recursive size of c: %zu\n", rsize);
  array_destruct(c);
  return EXIT_SUCCESS;
}
size_t get_recursize (const array_t* const a) {
  pfn();
  object_failnull(a);
  size_t out = 0;
  for (size_t i = 0; i < array_length(a); i++) {
    object_t** o = array_get_ref(a, i, NULL);
    if ( (*o)->type == t_array ) {
      out += get_recursize((*o)->ary);
    } else {
      ++out;
    }
  }
  return out;
}
Im Moment lebt es hier und du brauchst dieses Repo, um es zu benutzen.
Sie benötigen außerdem die libfnvfür Ihre Plattform kompilierte Fowler-Noll-Vo-Hash-Bibliothek . Es befindet sich in diesem Repository und kann auch hier abgerufen werden .
Dann kannst du machen cc -DNODEBUG size.c path/to/libfnv.a -o size.
Die Implementierung ist nicht unbedingt effizient: 
$ valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all ./size
==24127== Memcheck, a memory error detector
==24127== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==24127== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==24127== Command: ./size
==24127== 
Recursive size of a: 6
Recursive size of b: 60
Recursive size of c: 6000
==24127== 
==24127== HEAP SUMMARY:
==24127==     in use at exit: 0 bytes in 0 blocks
==24127==   total heap usage: 22,900 allocs, 22,900 frees, 615,584 bytes allocated
==24127== 
==24127== All heap blocks were freed -- no leaks are possible
==24127== 
==24127== For counts of detected and suppressed errors, rerun with: -v
==24127== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Aber es funktioniert! Das letzte Commit an Master (auf dem dieses Programm kompiliert wurde) war vor 2 Tagen, was bedeutet, dass diese Einreichung gültig ist.