Looking for c Keywords? Try Ask4Keywords

C LanguageAliasing und effektiver Typ


Bemerkungen

Verstöße gegen Aliasing-Regeln und gegen den effektiven Typ eines Objekts sind zwei verschiedene Dinge und sollten nicht verwechselt werden.

  • Aliasing ist die Eigenschaft von zwei Zeigern a und b , die auf dasselbe Objekt verweisen, d. a == b .

  • Der effektive Typ eines Datenobjekts wird von C verwendet, um zu bestimmen, welche Operationen an diesem Objekt ausgeführt werden können. Insbesondere wird der effektive Typ verwendet, um zu bestimmen, ob zwei Zeiger sich gegenseitig aliasieren können.

Aliasing kann ein Problem für die Optimierung, weil das Objekt durch einen Zeiger zu ändern, a sagen wir, kann das Objekt ändern , die durch den anderen Zeiger sichtbar ist b . Wenn Ihr C-Compiler davon ausgehen muss, dass Zeiger sich unabhängig von ihrem Typ und ihrer Herkunft immer gegenseitig Aliasnamen geben, gehen viele Optimierungsmöglichkeiten verloren und viele Programme laufen langsamer.

Die strengen Aliasing-Regeln von C beziehen sich auf Fälle, in denen der Compiler annehmen kann, welche Objekte sich gegenseitig aliasieren (oder nicht). Es gibt zwei Daumenregeln, die Sie für Datenzeiger immer beachten sollten.

Wenn nicht anders angegeben, können zwei Zeiger mit demselben Basistyp einen Alias ​​haben.

Zwei Zeiger mit unterschiedlichen Basistypen können keinen Aliasnamen verwenden, es sei denn, einer der beiden Typen ist ein Zeichentyp.

Basistyp bedeutet hier, dass wir Typqualifikationen wie const beiseite stellen, z. B. Wenn a double* und b const double* , muss der Compiler im Allgemeinen annehmen, dass eine Änderung von *a *b ändern kann.

Die Verletzung der zweiten Regel kann katastrophale Folgen haben. Unter Verletzung der strengen Aliasing-Regel werden hier dem Compiler zwei Zeiger a und b unterschiedlichen Typs präsentiert, die in Wirklichkeit auf dasselbe Objekt zeigen. Der Compiler kann dann immer davon ausgehen, dass die beiden auf unterschiedliche Objekte verweisen, und wird seine Vorstellung von *b nicht aktualisieren, wenn Sie das Objekt durch *a geändert haben.

Wenn Sie dies tun, wird das Verhalten Ihres Programms undefiniert. Daher setzt C ziemlich strikte Einschränkungen für die Zeigerumwandlung, um zu vermeiden, dass eine solche Situation versehentlich auftritt.

Wenn der Quell- oder Zieltyp nicht void , müssen alle Zeigerumwandlungen zwischen Zeigern mit unterschiedlichem Basistyp explizit sein .

Oder anders ausgedrückt, sie benötigen einen Cast , es sei denn, Sie führen eine Konvertierung durch, die dem Zieltyp lediglich ein Qualifikationsmerkmal wie const hinzufügt.

Das Vermeiden von Zeigerkonvertierungen im Allgemeinen und von Casts im Besonderen schützt Sie vor Aliasing-Problemen. Wenn Sie sie nicht wirklich brauchen und diese Fälle sehr speziell sind, sollten Sie sie nach Möglichkeit vermeiden.

Aliasing und effektiver Typ Verwandte Beispiele