Здравствуйте!
Хотелось бы понять, в чём разница при обращении по указателю к переменным классов
automatic и static.
Именно, есть пременная типа int, 32-х разрядная и хотелось непосредственно получить
доступ к её двум старшим байтам. В тестовой программе main я сделал так:
int val;
short int *pv = (short int*)((void*)&val +2);
Я знаю, что это плохо и так делать не следует, но сейчас у меня вопрос в другом.
Если теперь я меняю значение val и печатаю результат через pv, то и в 1-й и во 2-й
разы выводятся правильные значения.
В рабочей программе из main вызывается одна подпрограмма, из неё другая и в ней
я попробовал сделать то же самое с внутренней переменной, т.е класса automatic.
Оказалось, что правильное значение выводится только в 1-й раз, а в следующие,
несмотря на изменение val, продолжает выводиться то, что вывелось в 1-й раз, словно
бы эта val куда-то скопировалась и указатель установился на скопированное значение.
То же самое, если val маходится в области памяти, выделенной malloc.
Если же val внутри 2-й подпрограммы объявить как static, то при обращении к ней
через pv выводятся правильные значения. Там в цикле несколько раз делается
обращение к pv.
Если в 1-й подпрограмме объявить переменную val как static и передавать 2-й
её адрес и устанавливать pv относительно него
short int *pv = (short int*)((void*)pval +2);
то тоже всё работает.
Если же в 1-й подпрограмме val имеет класс automatic и во 2-й используется её адрес,
то наблюдается непонятное явление:
когда во 2-й подпрограмме после обращений к pv стоит отладочная печать,
то тоже всё работает. Если же печать отключить, то происходят сбои, что видно
по результатам работы программы в целом - она восстанавливает изображение из jpg-файла
и в этом случае картинка попорченная, а с печатью нормальная.
В чём тут причина? 2-я подпрограмма за врема работы 1-й вызывается 72000 раз,
сама программа работает секунд 20 или около, т.к. там очень большой отладочный
вывод, десятки мегабайт.
Ведь пока 2-я подпрограмма работает, выделенные ей страницы памяти вряд ли
куда-то перемещаются, а сама она быстрая. Почему же уже при 2-м обращении к pv,
если он получен из адреса объявленной в ней val класса automatic, результат неверный?
Это не зависит от того, инициализируется ли val при объявлении или нет.
Программа однопоточная, процессор четырёх-ядерный.
Использование переменной static не подходит, т.к. с ней работа замедляется,
а мне всё это надо, чтобы ускорить. Это в Ubiuntu 10.10.
Т.е. непонятно, какая в даном случае разница при объявленни во 2-й подпрограмме
val как static или automatic, ведь пока она не закончилась, все переменные ведь
сохраняются.
Пётр.