Reihenfolge der Elemente in einer Struktur



  • Servus Leute,

    Ich fasse mich kurz...

    typedef struct robot_history
    {// don't change the order of these elements
      double xc;
      double yc;
      double w_left;
      double w_right;
      double w_left_desired;
      double w_right_desired;
      struct robot_history *next;
      struct robot_history *prev;
    } ROBOT_HISTORY, * PROBOT_HISTORY;
    
    typedef struct robot
    {// don't change the order of these elements
      double xc;
      double yc;
      double w_left;
      double w_right;
      double w_left_desired;
      double w_right_desired;
      double orientation;
      int    energy;
      int    nb_goals_reached;  
      double robot_radius;
      double wheel_radius;
      double dist_between_wheels;
      double max_acceleration;
    
      const OBSTACLE *list_head_obstacles;
      ROBOT_HISTORY_HEAD history_head; 
    } ROBOT, * PROBOT;
    
    ...
    
    ROBOT_HISTORY rh;
    ROBOT rob;
    
    // VARIANTE 1
    memcpy (rh, rob, 6 * sizeof (double));
    
    // VARIANTE 2
    rh.xc = rob.xc;
    rh.yc = rob.yc;
    rh.w_left = rh.w_left;
    ...
    ...
    ...
    

    Nun die Frage...
    Auf meinem System läuft VARIANTE 1 prima. Könnte es aber sein, dass der Compiler eines anderen Systems die Reihenfolge der Elemente der Strukturen zwecks Optimierung verändert? Oder ist das im C-Standard irgendwo festgelegt, dass der Compiler diese Freiheit nicht hat? (Wenn ja, habt ihr gleich n Link wo das steht? (Muss das dem Informatiklehrer dann zeigen))...

    Ist es guter Stil oder soll ich das ändern?

    Schönes Wochenende und vielen Dank für eure Antwort(en) im Voraus,
    C-NooB



  • Hi,

    nein - die Reihenfolge ist obligatorisch.

    Freiheiten hat der Compiler beim Ausrichten der Member an bestimmte Vielfache von Speichergrenzen.
    (Er darf also z.B. Füllbytes benutzen)

    Viele Compiler haben entsprechende Anweisungen, um diese Grenzen explizit festzulegen.



  • C-NooB schrieb:

    Ist es guter Stil oder soll ich das ändern?

    Über den Stil kann man streiten, aber sinnvoll ist es durchaus. Die WinAPI macht z.B. auch Gebrauch von dieser Methode.

    Moritz


Anmelden zum Antworten