Рассмотрим две немного разные версии одного и того же кода:оценки/доступа к структуре
struct s
{
int dummy[1];
};
volatile struct s s;
int main(void)
{
s;
return 0;
}
и
struct s
{
int dummy[16];
};
volatile struct s s;
int main(void)
{
s;
return 0;
}
Вот что я получаю с GCC 4.6.2 для них:
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
movl _s, %eax
xorl %eax, %eax
leave
ret
.comm _s, 4, 2
и
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
call ___main
xorl %eax, %eax
leave
ret
.comm _s, 64, 5
Обратите внимание на отсутствие доступа к s
во втором корпусе.
Является ли это ошибка компилятора или я просто имеет дело со следующим утверждением стандарта C и ССАГПЗ разработчиков просто выбрал такую странную реализации, определенность и по-прежнему играю по правилам ?:
Что представляет собой доступ к объекту, который имеет изменчивый тип, определяется реализацией.
В чем причина этой разницы? Я, естественно, ожидал бы, что вся структура будет доступна (или не будет доступна, я не уверен), независимо от ее размера и того, что внутри него.
P.S. Что делает ваш компилятор (не-gcc или new gcc) в этом случае? (, пожалуйста, ответьте на этот последний вопрос в комментарии, если это единственная часть, на которую вы собираетесь обратиться, поскольку это не главный вопрос, который задают, но скорее вопрос любопытства).
Я только что попробовал с GCC 4.8.0, и он похож: версия с одним словом по-прежнему получает одно чтение, но версия из 16 слов - нет. Если я говорю «s = s», хотя даже структура с 16 входами получает копию. –
Это интересно: руководство GCC 4.6.0 специально вызывает _scalar volatiles_, в то время как в руководстве GCC 4.0.4 нет (два из них мне быстро удалось найти в Google). 4.6.0: http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Volatiles.html 4.0.4: http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc /Volatiles.html В вашем примере структура с одним int является «скалярным», а одно с 16 ints - нет. –
@JoeZ Я не получаю доступ к скалярам, находящимся внутри структуры, я обращаюсь ко всей структуре (или, как я думаю). –