У меня есть функция, и в функции у меня есть две переменные,
int auth_flag = 0;
char buffer[16];
Теперь вот вывод x/s buffer
команды gdb
0xffffd01c: "\201\203\004\b\344\203\373\367\002"
и вывод print &auth_flag
$1 = (int *) 0xffffd018
Теперь из вывода видно, что местоположение auth_flag составляет 4 байта перед буфером. Теперь, если я объявляю такие переменные, как это
char buffer[16];
int auth_flag = 0;
вывод предыдущих команд
0xffffd00c: "\201\203\004\b\344\203\373\367\002" and
$1 = (int *) 0xffffd008
Тоже самое. 100 байт, но порядок тот же. Мои qs есть. Поскольку я изменил объявление переменной, почему в gcc адресный порядок переменной не изменился. Я читаю книгу, где говорится, что адрес должен быть отменен, но этого не происходит в моем компьютере. Поэтому я действительно смущен.
Запишите эту книгу, если она говорит, что автоматические переменные имеют какое-либо конкретное отношение адресов друг к другу в стандарте C или C++. Поля в struct
или class
имеют макет, определенный реализацией. Автоматические переменные даже не гарантируются для выделения памяти.
Теперь, что гарантирует C++, порядок, в котором определены символы (конструкция времени компиляции, а не проблема макета памяти) и какие конструкторы заказов вызываются. Например, этот порядок определяет, что означает следующий код в точный способ:
int foo(int x)
{
int y = x; // this sees the argument x
int x = 3; // this defines an automatic variable named x that shadows the argument
return x + y;
}
C++ также предоставляет гарантии порядка строительства и уничтожения объектов. (Построены, когда они попадают в сферу действия по внешнему виду, разрушаются в обратном порядке строительства, поскольку они оставляют объем.) Но я не буду глубоко вникать в это, поскольку это выходит за рамки вашего вопроса.
#pragma OPTIMIZE OFF