Zaintrygowany tematem kolegi Qmexx postanowiłem dorzucić beczkę dziegciu do tej łyżki miodu niemniej kolega mnie uprzedził i zamknął temat. Chciałbym zapytać o jeszcze dwie dziwne przypadłości z którymi się spotkałem w czasie mojej zabawy z avrgcc.
1.
We wskazanym fragmencie kompilator przetwarza zmienną xpos jako int mimo że zadeklarowana jest jako char. Próby jawnego rzutowania na char nie dały najmniejszego rezultatu. W zasadzie poddałem się stwierdzając jakąś wyższą konieczność kompilatora do takiego zachowania po czym już całkiem przypadkowo aby sprawdzić różnicę w objętości kodu podmieniłem tą linię na xpos = (xpos%8); i voila! Kompilator potraktował zmienną i operacje na niej jako char. Czemu wcześniej nie chciał?
2. Mam dwie mocno zbliżone do siebie funkcje. Obie korzystają mniej więcej z tych samych rejestrów i obie je niszczą oraz obie są wywoływane bezpośrednio z main i nie są częścią innej funkcji. I teraz niespodzianka - w przypadku pierwszej funkcji kompilator wrzuca wszystkie możliwe rejestry na stos a w przypadku drugiej nie odkłada ani jednego. Od czego to zależy?
1.
Kod: C / C++
We wskazanym fragmencie kompilator przetwarza zmienną xpos jako int mimo że zadeklarowana jest jako char. Próby jawnego rzutowania na char nie dały najmniejszego rezultatu. W zasadzie poddałem się stwierdzając jakąś wyższą konieczność kompilatora do takiego zachowania po czym już całkiem przypadkowo aby sprawdzić różnicę w objętości kodu podmieniłem tą linię na xpos = (xpos%8); i voila! Kompilator potraktował zmienną i operacje na niej jako char. Czemu wcześniej nie chciał?
2. Mam dwie mocno zbliżone do siebie funkcje. Obie korzystają mniej więcej z tych samych rejestrów i obie je niszczą oraz obie są wywoływane bezpośrednio z main i nie są częścią innej funkcji. I teraz niespodzianka - w przypadku pierwszej funkcji kompilator wrzuca wszystkie możliwe rejestry na stos a w przypadku drugiej nie odkłada ani jednego. Od czego to zależy?
