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.