Offene Cee FAQ / Dynamische Allokierung Von Matrizen
 
StartSeite | OffeneCeeFAQ/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Diese Seite bezieht sich auf DclcFAQ:2.14, die IMO nicht ganz zutreffend ("meistens die beste") bzw. nicht vollständig ist.

Verändert eine Matrize während ihrer Lebensdauer die Form, dann trifft die FAQ zu. Es muss nur ein Teil der Matrize neu allokiert werden.

Bleiben die Dimensionen einer Matrize jedoch während der Lebensdauer konstant (der häufigere Fall), dann ist eine flache Allokierung der Matrize (nur 1 Allokierung) platzsparender, schneller und einfacher zu handhaben. Eine Implementierung für eine beliebige Anzahl von Dimensionen gibt Bob Stout's snippet-collection [1].

-- HelmutLeitner

"flache" Matrix-Allokierung (Prinzip aus der Erinnerung)

void PtrArrayDimSetStartInc(char **par,int dim,char *start,int increment)
{
  while(dim--) {
    *par++ = start;
    start += increment;
  }
}

int IntRoundUpMultiple(int i,int multiple)
{
  if(i>1) {
    i += multiple-1;
    i -= i%multiple;
  }
  return i;
}

void *MatrixCreateDimDimElsize_Flat(int dim1,int dim2,int element_size) 
{
  int table_size=IntRoundUpMultiple(dim1*sizeof(char *),element_size);
  void *m=calloc(table_size+dim1*dim2*element_size,1);
  if(m) {
    PtrArrayDimSetStartInc(m,dim1,((char *)m)+table_size,element_size*dim2);
  }
  return m;
}

int main() 
{
  double **double_matrix=MatrixCreateDimDimElsize_Flat(10,10,sizeof(double));
  double_matrix[3][4]=3.14;
  free(double_matrix);
  return 0;
}

Anmerkungen

BTW mein Nachlesen wundert es mich, dass im snippet auf das Alignment der Datenelemente keine Rücksicht genommen wird.

Um das Beispiel nicht aufzublasen, habe ich keine Rücksicht auf int vs. size_t, bzw. auf eine eventuelle Pointer-Konvertierungsproblematik genommen.

Bilanz

Ein Vergleich der beiden Varianten bei 2 Dimensionen (Speicherbedarf an angenommem s2p4d8malloc16):

=Speicherbedarf (Allokierungen)FAQ-VarianteSnippet-Variante
Matrix 10x10 double=848 (11)=848 (1)
Matrix 3x3 double=128 (4)=96 (1)
Matrix 5x5 short=112 (6)=80 (1)
Matirx 4x4 char=80 (5)=32 (1)


KategorieC KategorieCee
StartSeite | OffeneCeeFAQ/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:42 (diff))
Suchbegriff: gesucht wird
im Titel
im Text