От чего зависит порядок сохранения переменных в памяти? - PullRequest
1 голос
/ 24 октября 2011

Я недавно узнал о Си и столкнулся с чем-то, на что, похоже, не могу найти хорошего ответа.

В моем коде я мог бы иметь:

struct randomStruct a;
struct secondStruct array[5];
struct structyStruct q = { 17, "Hey yo", {123,123}};

Но в памяти они могут храниться как:

q, a, array

То, что я имею в виду, это то, что адрес q в памяти меньше, чем a, что ниже, чем у массива.

От чего зависит порядок сохранения переменных в памяти?

(Если вам нужна дополнительная информация / актуальный исполняемый код, пожалуйста, дайте мне знать)

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 24 октября 2011

То, что вы видите, происходит из-за направления роста стека .

Стандарт ничего не говорит об адресах автоматических переменных.Таким образом, не требуется, чтобы существовала связь между адресами переменных.

2 голосов
/ 24 октября 2011

В языке C отдельные объекты (то есть объекты, которые не являются частью одной структуры или массива) не имеют порядка в памяти. Сравнение и вычитание указателей определяются только для указателей на элементы общего массива.

2 голосов
/ 24 октября 2011

Стандарт C определяет порядок памяти элементов в структуре, и многие (возможно, все) реализации явно определяют порядок памяти параметров для переменных функций, но порядок автоматических и статических переменных следует рассматривать как нечто, что компиляторможет произвольно или случайно устроить без рифмы или причины.Многие компиляторы используют хеш-таблицу для идентификаторов, и, по крайней мере, некоторые компиляторы упорядочивают переменные в соответствии со своими хеш-кодами, что делает размещение переменных эффективно случайным.исполнение, чем другие.Например, компилятор для определенного микроконтроллера может определить, что размещение двух переменных в пределах 256 байт друг друга позволит ему загрузить адрес одной в регистр и затем использовать адресацию с коротким смещением для доступа к обоим;даже если сегодняшний компилятор не выполнит эту оптимизацию, нет никаких оснований полагать, что завтрашняя сделка не удастся.

Если вы заботитесь об относительном расположении переменных в памяти, то вы должны либо пометить переменные в поставщике.конкретный способ (обычно с использованием директив #pragma) для управления их размещением в памяти или для размещения всех представляющих интерес переменных в структуре.В некоторых случаях может быть полезно использовать макросы #define, чтобы позволить элементам структуры ссылаться на то, что похоже на имена переменных;самая большая оговорка при этом заключается в том, что макросы #define не подчиняются никаким нормальным правилам области видимости;следовательно, нужно быть уверенным, что имена «переменных» не используются в качестве какого-либо идентификатора где-либо в программе.

1 голос
/ 24 октября 2011

Все эти предметы объявлены в стеке, поэтому вы видите это.

См вики на стеки.

http://en.wikipedia.org/wiki/Stack_(abstract_data_type)

Затем проверьте это на макете памяти. Должен ответить на ваш вопрос.

http://discussknowhow.blogspot.com/2008/08/memory-layout-of-c-program-stack-wise.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...