A: EIGENTLICH verbraucht ja eine IP als String (lassen wir Unicode und Co mal aussen vor, danke

B: EIGENTLICH verbraucht ja eine IP als IPLong immer exakt 4 Bytes, bspw. 2130706400
Bildet man nun fuer A einen String, z.B. so:
"123.123.123.123 123.123.123.128"
und fuer B ein Array z.B. so:
array(2130706400, 2130706405)
und nimmt man memory_get_usage(true) zu Rate, kommt doch (Staunen!) tatsaechlich heraus, dass der String (mit einer Info-Dichte von hier z.B. 15+1+15 = 31 Chars) an Speicher SEHR VIEL WENIGER verbraucht, als das Array mit zwei 4-Byte-Long-Werten. Klar, das Array benoetigt noch einen gewissen "Overhead fuer Selbstorganisation" aber demnach ist der ja riesig!?
Man koennte nun annehmen, das ist eben bei wenigen Elementen so, da das Array "Overhead fuer Selbstorganisation" benoetigt. ABER: Die Differenz aendert sich auch NICHT wesentlich, wenn man bspw. 3000 Elemente als String bzw. als Array anlegt, der String verbraucht IMMER weniger Speicher, obgleich er doch EIGENTLICH die hoehere Informationsdichte aufweist.
Ergebnis fuer 3000 15Chars-IPs in String:
Info-Dichte EIGENTLICH: 3000*15 Chars + 3000*1 Leerzeichen: 48000 bytes
REALER SPEICHERVERBRAUCH: 60152 bytes (ca. Faktor 1,25 der Info-Dichte)
Ergebnis fuer 3000 4Byte-Long-IPs in einfachem Array:
Info-Dichte EIGENTLICH: 3000*4 Bytes: 12000 bytes
REALER SPEICHERVERBRAUCH: 184512 bytes (ca. Faktor 15 der Info-Dichte!!)
Muss man das verstehen? Ist das wieder mal ein FEATURE von PHP?
Oder ist die Messmethode get_memory_usage einfach ZU unzuverlaessig, die Testannahmen falsch, was gibt es evtl. an guten Alternativen?
Moeglich waere ja noch dass ein internes type casting stattfindet, nur sehe ich nicht wo es Sinn ergeben wuerde..