Гарантируется ли, что переменные Complex Float будут 8-байтовыми в памяти?
В C99 были определены новые сложные типы. Я пытаюсь понять, может ли компилятор воспользоваться этими знаниями для оптимизации доступа к памяти. Являются ли эти объекты (A
-F
) типаcomplex float
гарантированно выровнен в памяти 8 байт?
#include "complex.h"
typedef complex float cfloat;
cfloat A;
cfloat B[10];
void func(cfloat C, cfloat *D)
{
cfloat E;
cfloat F[10];
}
Обратите внимание, что дляD
вопрос касается объекта, на который указываетD
, а не к самому хранилищу указателей. И, если это предполагается выровненным, как можно быть уверенным, что переданный адрес имеет фактический комплекс, а не приведение из другого (не выровненного по 8) типа?
ОБНОВЛЕНИЕ 1: я, вероятно, ответил сам в последнем комментарии относительноD
указатель. B / c нет способа узнать, какой адрес будет назначен параметру вызова функции, нет способа гарантировать, что он будет выровнен по 8. Это разрешимо через__builtin_assumed_aligned()
функция.
Вопрос по-прежнему открыт для других переменных.
ОБНОВЛЕНИЕ 2: я отправилдополнительный вопрос здесь.