Порядок переменных в памяти

Влияет ли порядок объявления переменных в коде на то, в каком порядке и где им выделяет память компилятор? Например, у меня password_buffer и auth_flag не меняют своё местоположение, если я изменю их положение в коде:

1 вариант

int check_authentication(char *password) {
    char password_buffer[16];
    int auth_flag = 0;

    strcpy(password_buffer, password);

    if (strcmp(password_buffer, "brilling") == 0)
        auth_flag = 1;
    if (strcmp(password_buffer, "outgrade") == 0)
        auth_flag = 1;

    return auth_flag;
}

2 вариант

int check_authentication(char *password) {
    int auth_flag = 0;
    char password_buffer[16];

    strcpy(password_buffer, password);

    if (strcmp(password_buffer, "brilling") == 0)
        auth_flag = 1;
    if (strcmp(password_buffer, "outgrade") == 0)
        auth_flag = 1;

    return auth_flag;
}

Ответы (1 шт):

Автор решения: AlexGlebe

Локальные переменные по умолчанию имеют автоматический класс хранения. Т.е.

auto int auth_flag = 0;

для вашего кода компилятор gcc решил, что правильнее хранить эту переменную в регистрах, то-есть так :

register int auth_flag = 0;

А массивы в Си всегда должны храниться в памяти, то есть в стеке. И компилятор отнял у регистра SP (Stack Pointer) 16 байт.

Дальше переменные с плавающей запятой компилятору удобнее хранить в математических регистрах процессора. А их у него очень много. И у них нет адреса вообще, только имя.

При входе в функцию для тех переменных, которым компилятор решил выделить место в стеке он им выделяет один раз память для всех. А вопрос, кто выше/ниже не имеет ответа, это не имеет значения.

Пример, где порядок имеет значение, это объявление структуры. Так как это тип, у него должно быть фиксированное место элементов и в том порядке, что и расписано.

→ Ссылка