Гарантируется ли, что переменные 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: я отправилдополнительный вопрос здесь.

 Brett Hale07 июн. 2012 г., 13:03
Это действительноABI вопрос. C имеет статическую типизацию, поэтому вы не можетеensure адрес указывает на переменную или объект определенного типа.
 Brett Hale07 июн. 2012 г., 14:29
Стандарт C имеет определенные гарантии относительно выравнивания, упаковки, заполнения и т. Д. Для согласованного поведения. Однако предпочтительное (и часто требуемое) выравнивание данных обычно зависит от платформы.
 ysap07 июн. 2012 г., 14:22
Спасибо, @BrettHale. Почему бы не сделать это ответом вместо комментария? Задача вопроса - действительно понять, диктует ли стандарт какое-либо выравнивание для этих переменных. Из вашего комментария я понимаю, что это не так, верно? Какое это имеет отношение к "статически типизированному"?

Ответы на вопрос(1)

Решение Вопроса

float complex гарантированно имеет ту же структуру памяти и выравнивание, что и массив из двухfloat (& # XA7; 6.2.5). То, каким будет это выравнивание, определяется вашим компилятором или платформой. Все, что вы можете сказать наверняка, это то, чтоfloat complex являетсяat least as aligned какfloat.

if that is assumed aligned, how can one be sure that the address passed is of an actual complex and not a cast from another (non 8-aligned) type?

Если вызывающая сторона передает вам недостаточно выровненный указатель, это является неопределенным поведением и ошибкой в их коде (& # xA7; 6.3.2.3). Вам не нужно поддерживать это (хотя вы можете выбрать).

 ysap07 июн. 2012 г., 17:32
Благодарю. Только что опубликовал продолжение здесь:stackoverflow.com/questions/10934987/…
 ysap07 июн. 2012 г., 17:23
Таким образом, это означает, что нет никакой гарантии (согласно стандарту) для 8-выравнивания.
 07 июн. 2012 г., 17:31
@ysap: правильно. Нет гарантии (согласно стандарту) даже на 1-байтовое выравнивание.

Ваш ответ на вопрос