Вопрос по gcc, compiler-optimization, memory-alignment, complex-numbers, c99 – Гарантируется ли, что переменные Complex Float будут 8-байтовыми в памяти?

1

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

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

Ваш Ответ

1   ответ
2

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). Вам не нужно поддерживать это (хотя вы можете выбрать).

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

Похожие вопросы