Zugriff auf C-Array optimieren



  • Ist es egal in welcher Reihenfolge auf das C-Array <table> zugegriffen wird?

    int table[SIZEA][SIZEB][SIZEC][SIZED];
    
    template<int A, int C>
    int Table(int b, int d) {
      return table[A][b][C][d];
      // *(*(*(*(table+A)+b)+C)+d)
    }
    

    Ich könnte mir vorstellen, dass dieser Zugriff aus Sicht der Laufzeit nicht optimal ist, da Compilezeit und Laufzeit Parameter vermischt sind und der Compiler die korrekte Adresse nicht so gut berechnen kann. Stimmt das, oder irre ich mich und es macht keinen Unterschied?

    Mein Vorschlag wäre:

    int table[SIZEA][SIZEC][SIZEB][SIZED];
    
    template<int A, int C>
    int Table(int b, int d) {
      return table[A][C][b][d];
      // *(*(*(*(table+A)+C)+b)+d) => *(*(**const+b)+d)
    }
    

  • Mod

    Die Indexberechnung sollte ziemlich egal sein. Probier es im Zweifel aus. Falls es einen Unterschied macht, melde dich, denn das wäre sehr überraschend.

    Was hingegen wichtig ist, ist die Reihenfolge beim Durchlaufen von Arrays. Hier gilt es, von Rechts nach Links vorzugehen. Also den rechtesten Index in der innersten Schleifenebene zu durchlaufen. Konkret

    int array[X][Y];
    for (int x = 0; x < X; ++x)
     for (int y = 0; y < Y; ++y)
      Funktion(array[x][y]);
    
    // statt
    
    int array[X][Y];
    for (int y = 0; y < Y; ++y)
     for (int x = 0; x < X; ++x)
      Funktion(array[x][y]);
    


  • Es sieht so aus, als dass ein Unterschied im Laufzeitverhalten kaum messbar ist. Sollte ich doch noch auf signifikante Unterschiede stoßen, melde ich mich natürlich.


Log in to reply