A czy zmiana ich kolejności nie ma wpływu na czas dostępu do nich? Do której zmiennej teoretycznie jest najszybciej się dostać? Na logikę działania stosu powiedziałbym, że do ostatniego zarezerwowanego (najwiekszego) ale czy na pewno? Także zauważyłem, że jeżeli w miarę jawnie najpierw zadeklarowałem short d to adresy pozostają bez zmian, więc to kompilator je “przestawia”, choć może ja coś źle robie bo nie do końca to wszystko rozumiem
int a=3;
short int d = 10;
int b=5, c=7;
Adres a: 0xbffa5d1c
Adres b: 0xbffa5d20
Adres c: 0xbffa5d24
Adres d: 0xbffa5d3c
Adres e: 0xbffa5d3e
Kompilator robi wiele rzeczy, żeby wyprodukować bardziej optymalny kod. Między innymi wyrównuje adresy zmiennych do danych wartości (wielokrotności iluś bajtów) - może to być wymagane przez procesor i inaczej kod by nie działał (ew. tylko pewne instrukcje mogą wymagać wyrównania adresów) albo nie jest to wymagane, ale może przyśpieszyć jakiś operacje. W efekcie mogą wystąpić nieużywane obszary pamięci, służące jedynie jako wyrównanie dla innych zmiennych. Zobacz http://en.wikipedia.org/wiki/Data_padding
Przestawianie zmiennych w pamięci ma na celu między innymi zmniejszyć dodatkowe zajęcie pamięci spowodowane przez wyrównywanie.
Jeśli można tak ułożyć zmienne, aby wszystkie ich adresy na stosie miały odpowiednie wartości to kompilator może to zrobić.
Nazwy obszarów pamięci - stos, sterta - nie mają związku z dostępem do zmiennych, a z alokacją pamięci do nich, więc sam dostęp w ramach obszaru jest jest jednakowy
Tak jak zacytowałem powyżej, kompilator może robić ze zmiennymi na stosie bardzo dużo, już zależy od procesora/systemu/kompilatora/opcji kompilatora.
Nie, jeśli adres kończy się na e0 i zmienna ma rozmiar 4 bajtów, to końcowy adres to e4.
Każdy bajt zajmuje jedną komórkę pamięci. Wskaźnik wskazuje na pierwszy bajt zmiennej.
Nie licząc cache’u, swapu i innych bajerów, dostęp do każdej komórki pamięci trwa tyle samo.
Stos na x86 to nie jest jakaś magiczna struktura, tylko po prostu wyznaczony fragment pamięci. To, że są specjalne instrukcje do operowania stosem nie znaczy, że nie można go używać jak normalnej pamięci.