Ist es garantiert, dass komplexe Float-Variablen 8 Byte im Speicher ausgerichtet werden?

In C99 wurden die neuen komplexen Typen definiert. Ich versuche zu verstehen, ob ein Compiler dieses Wissen bei der Optimierung von Speicherzugriffen nutzen kann. Sind diese Objekte (A-F) vom Typcomplex float garantiert 8 Byte im Speicher ausgerichtet sein?


#include "complex.h"
typedef complex float cfloat;

cfloat A;
cfloat B[10];

void func(cfloat C, cfloat *D)
{
    cfloat E;
    cfloat F[10];
}

Beachten Sie, dass fürDbezieht sich die Frage auf den von angesprochenen GegenstandD, nicht auf den Zeigerspeicher selbst. Und wenn dies als ausgerichtet angenommen wird, wie kann man dann sicher sein, dass die übergebene Adresse von einem tatsächlichen Komplex und nicht von einer Umwandlung eines anderen (nicht 8-ausgerichteten) Typs ist?

UPDATE 1: Ich habe mich wahrscheinlich im letzten Kommentar bezüglich des beantwortetD Zeiger. B / c gibt es keine Möglichkeit zu wissen, welche Adresse dem Parameter des Funktionsaufrufs zugewiesen wird, es gibt keine Möglichkeit zu garantieren, dass er 8-ausgerichtet ist. Dies ist lösbar über die__builtin_assumed_aligned() Funktion.

Für die anderen Variablen ist die Frage noch offen.

UPDATE 2: Ich habe ein gepostetFolgefrage hier.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage