2015-07-10 3 views
0

Сомнение:Сегмент данных во время выполнения программы

Если мы выполним программу, то будет выделен тип памяти, выделенной этой программе.

          __________________ 
              |    | 
              |  stack  | 
              |    | 
              ------------------ 
              |    | 
              | <Un Allocated| 
              |  space> | 
              ------------------ 
              |    | 
              |    | 
              |  Heap  | 
              |    | 
              |    | 
              __________________ 
              |    | 
              |  data  | 
              __________________ 
              |  text  | 
              __________________ 

Здесь сегмент данных играет жизненно важную роль. Все инициализированные данные и неинициализированные данные присутствуют в сегменте данных. Но я не знал о порядке хранения данных в сегменте данных. Для Ex, инициализированные данные, неинициализированные данные, только чтение и данные записи чтения. Я думаю, что приведенные выше четыре типа присутствуют в сегменте данных.

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

Спасибо заранее.

+1

ummmm..where вопрос программирования в этом? –

ответ

0

Порядок глобальных переменных в сегменте данных не может быть определен заранее - это зависит от вашего компоновщика и компилятора. Обычно линкеры сохраняют порядок, в котором переменные появляются в связанных объектных файлах, но это не является жестким требованием (например, компоновщик может сначала поставить double, а char - последним, чтобы сохранить требуемые байты выравнивания).

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