• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Speicherbereich initialisieren in C

Herakles

Profifragensteller
Themenstarter #1
Moin!

Ich möchte gern einen ganzen Speicherbereich mit einem bestimmten Wert initialisieren, der ungleich 0 ist. Der einfache Weg ist eine for-Schleife, die ist jedoch nicht performant genug, das Ganze wird SEHR(!) oft durchgeführt und sollte deshalb um einiges schneller gehen.

memset(3) belegt nur Bytes, ich benötige jedoch eine Initialisierung eines integer-Arrays, was sich mit memset nur vergleichsweise schlecht erledigen lässt.

Kurz gefragt: wie bekomme ich einen integer-Array mit 600 Elementen derart initialisiert, dass jedes Element den Wert "-255" hat?

Code:
int spielarray[600] = {-255};
bringt im übrigen auch nichts, hier wird leider nur das erste Element im Array auf den gewünschten Wert gesetzt...

Danke für jede Hilfe,

Herakles
 

zyon

Rule Zero
#2
Quick & Dirty

Code:
int spielarray[600]= {-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,
-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,
-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,-255,
-255,-255,-255,-255,-255,-255};
 

Kamikaze

Warrior of Sunlight
Mitarbeiter
#4
Ist aber die performanteste Methode, dafür gibt es ein großes Binary. Sonst bleibt dir nur die Schleife, dann gibt es ein kleines Binary aber schlechtere Performance. Nicht, dass das bei einem array mit 600 Integern eine Rolle spielt. Ich würde die Schleife bevorzugen.
 

dettus

Bicycle User
#5
was spricht gegen memset?

Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        unsigned int mem[1024];
        int i;

        memset(mem,0,1024*sizeof(int));

        for (i=0;i<1024;i++)
        {
                printf("%08x ",mem[i]);
        }
        printf("\n");
}
sonst wuerde ich dir empfehlen memcpy zu benutzen:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        static unsigned int initarray[1024];
        static int inited=0;
        unsigned int mem[1024];
        int i;

        if (!inited)
        {
                for (i=0;i<1024;i++) initarray[i]=0x2342;
        }

        memcpy(mem,initarray,1024*sizeof(int));
        for (i=0;i<1024;i++)
        {
                printf("%08x ",mem[i]);
        }
        printf("\n");
}
braucht zwar mehr speicher. aber wir habens ja ;)
 

Tron

Well-Known Member
#7
Nochmal zum mitschreiben: Du willst 2400 Bytes (600 * 4 bei 4 Byte ints) initialisieren und eine Schleife ist dir nicht schnell genug? Es darf sehr stark bezweifelt werden, dass 5 Sektoren (angenommen die ueblichen 512 Byte Sektoren), die eben diese Daten enthalten, von einer Platte laden schneller ist. Mit welchen Messungen hast du im Uebrigen belegt, dass dir die Schleife zu langsam ist?

PS: Da bei den vorbelegten Daten dann noch COW zuschlaegt, was einen PF zur Folge hat und die Daten dann nochmal kopiert werden, ist das dann zusaetzlich nochmal langsamer.
 

Herakles

Profifragensteller
Themenstarter #8
@Tron:
Gut, gut. Getestet habe ich es gar nicht. Wenn man sich Deine Argumentation ansieht, gewinnst Du das Duell wohl mit 1:0. Meines Wissens nach war eben ein "memset" immer die schnellste Möglichkeit, Speicher zu initialisieren und eine Schleife vergleichsweise langsam. Bei einer derart kleinen Schleife dürfte wohl selbst das Targetsystem (233MHz) schnell genug sein.

Eigentlich wollte ich auch nur sicher gehen, dass ich keine GUTE Möglichkeit der Initialisierung außer Acht lasse, weil ich zu unwissend bin.

Aber nochmals: für meinen Zweck zieht Deine Argumentation voll und ganz. Selbst bei mehrmaligem Durchlaufen der Schleife ist sie wohl eine der besten Lösungen, ohne jetzt ernsthaft Messungen durchführen zu wollen oder zu können.

Herakles
 

Tron

Well-Known Member
#9
Rate mal, wie memset() funktioniert. Richtig, mit einer Schleife. Da wird eventuell etwas Magie betrieben und es werden Vektorregister zum schreiben verwendet, da diese breiter sind und so mehr Bytes pro Befehl beschrieben werden, aber mehr ist da auch nicht dahinter und bei deiner Problemstellung scheint mir das in die Kategorie "irrelevant" zu fallen.
Des Weiteren sieht mir "-255" verdaechtig nach einer magischen Zahl aus und sollte durch eine symbolische Konstante ersetzt werden. Und falls du dir auf Biegen und Brechen die explizite Initialisierung klemmen willst, dann sorge dafuer, dass 0 eben als Startwert dienen kann. Ich wuerde sagen, dass es viel wichtiger ist, nicht aus dem Cache zu fallen.
 

lme

FreeBSD Committer
#12
char array[ZAHLKONSTANTE] = { 0 }; gibts eigentlich auch. c-version gesetzt?
Das initialisiert das ganze Array mit Nullen. Gewollt ist aber der Wert -255. Nur einmal -255 in die geschweiften Klammern zu schreiben nuetzt auch nichts, da dann die restlichen Werte immer noch mit Nullen initialisiert werden.
 

Herakles

Profifragensteller
Themenstarter #13
Wieso ist es eigentlich so, dass mit

Code:
int array[ZAHLKONSTANTE] = { 0 };
nur das erste Element initialisiert wird? In einem C-Buch ("C von A bis Z", Wolf) steht, dass alle Elements initialisiert werden und aus dem Studium kenne ich das ebenfalls so.

Womit kann man das erklären?

Beste Grüße
Herakles
 

oenone

Programmierer
#14
Wieso ist es eigentlich so, dass mit

Code:
int array[ZAHLKONSTANTE] = { 0 };
nur das erste Element initialisiert wird?
Ist eben nicht so.


Ansonsten: Hier sind noch ein paar Beispiele aufgeführt, die zweite Antwort nutzt GCC-Erweiterungen, um allen Elementen in kurz und knapp einen bestimmten Wert zuzuweisen, also genau das was der OP wollte. Außer der Erweiterung (wenn du unabhängig vom Compiler bleiben willst) kommst du wohl nicht um eine Schleife herum.