Czy to gwarantuje, że zmienne zmiennoprzecinkowe będą wyrównane w pamięci 8 bajtów?

W C99 zdefiniowano nowe typy złożone. Próbuję zrozumieć, czy kompilator może wykorzystać tę wiedzę w optymalizacji dostępu do pamięci. Czy te obiekty (A-F) typucomplex float gwarantowane 8-bajtowe wyrównanie w pamięci?


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

cfloat A;
cfloat B[10];

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

Zauważ, że dlaD, pytanie dotyczy obiektu wskazywanego przezD, nie do samej pamięci wskaźnika. A jeśli zakłada się, że jest wyrównany, jak można mieć pewność, że przekazany adres jest rzeczywistym kompleksem, a nie rzutem z innego typu (nie wyrównanego do 8)?

AKTUALIZACJA 1: Prawdopodobnie odpowiedziałem sobie w ostatnim komentarzu dotyczącymD wskaźnik. B / c nie ma sposobu, aby dowiedzieć się, jaki adres zostanie przypisany do parametru wywołania funkcji, nie ma sposobu, aby zagwarantować, że będzie on wyrównany do 8. Można to rozwiązać za pomocą__builtin_assumed_aligned() funkcjonować.

Pytanie jest nadal otwarte dla innych zmiennych.

AKTUALIZACJA 2: Wysłałem apytanie uzupełniające tutaj.

questionAnswers(1)

yourAnswerToTheQuestion