|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.12.2011, 01:09 | #31 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Я на самом деле не совсем понимаю, как в действительности правильно трактовать данный пункт стандарта.
Лично я понимаю это так: все не инициализированные явно статические переменные должны хранить значение ноль. Однако, стандарт не указывает как именно данный пункт стандарта должен быть выполнен. А теперь смотрим в сторону статический области памяти. Что это такое? Это область памяти, выделяемая процессу при создании (есть и другие разновидности памяти, например - стек, но это уже из другой оперы). О том, сколько этой памяти должно быть выделено процессу, и какие значения должны хранить ячейки этой памяти - все это хардкорно зашивается в сам формат exe файла. Если данная ячейка памяти не имеет явного значения, значит она - ноль. Вся статическая память по дефолту заполнена нулями! Так как все глобальные переменные живут по одним и тем же адресам, и их значения заранее известны - можно при создании процесса проинициализировать эти значения данными из ехе файла. Вся остальная память - нули. Если вы создадите явно инициализированную глобальную константу, то её значение так же запишится в сам ехе файл, и при запуске процесса константа уже родится с готовым значением. Если же вы создадите неинициализированный глобальный массив из 1024 элементов типа int, то в ехе файл запишится только указивка - сколько нужно выделить памяти под эти элементы (естейственно, сами значения не будут записаны в ехе файл из экономии места. И потом, нафига это нужно, если известно что они все по дефолту все равно нули? Будит записано только количество) Таким образом, неинициализированные глобальные переменные смотрят на ячейки заполненные нулями. Однако при этом, никаких особых конструкторов, которые умеют определять глобальна ли переменная, и специально для глобальных записывать нули - нет. у простых типов данных, например у int дефолтный конструктор вообще ничего не делает. /зы если же вы создадите в глобальной области крупный массив явно-инициализированных данных, ваш ехе файл рискует многократно увеличится в размерах. Последний раз редактировалось _Bers; 24.12.2011 в 01:14. |
24.12.2011, 01:31 | #32 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
но на практике в винде может быть и иначе. просто в стандарте на exe указано, что члены .bss секции будут нолями и все. это используется для уменьшения размера exe, не более того. Цитата:
стек он и есть стек. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 24.12.2011 в 01:36. |
||
24.12.2011, 01:50 | #33 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Ехе файл не содержит код для не_явной инициализации статиков. И уж точно никаких таких конструкторов, которые по дефолту инициализируют глобальную переменную нулём так же не существует. Только эту часть памяти винда сама выделяет каждому процессу в дополнение к статической. И она не заполняется нулями при старте. Соответственно, стековые переменные по дефолту смотрят на мусор. |
|
24.12.2011, 01:56 | #34 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
нулями она инициализируется между прочим тоже. Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 24.12.2011 в 02:13. |
|||
24.12.2011, 01:59 | #35 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
24.12.2011, 02:11 | #36 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
а стек у вершины, в двух приложения в момент точки входа, очень уж похож, чтоб считать случайным мусором. а мусор потом изза скачков по стеку. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
24.12.2011, 02:15 | #37 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
24.12.2011, 02:25 | #38 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
обьясню попроще:
Код:
Код:
а потом выйдя из процедуры, другая процедура вновь использует эту область стека, а грязь то так и остается, вот и мусор. условно показаны скачки по стеку на рисунке(локальные переменные, вызовы функций) ось Х это время(слева направо) ось У положение esp(или обьем использования стека, без разницы) в итоге видно, что одна и таже область стека может использоваться разными процедурами не один раз. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
24.12.2011, 02:44 | #39 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Аааа... то есть, получается, что винда выделяет девственно чистую статик память + стек (как часть этой статик памяти, но под юрисдикцией оси, а не ехе).
Однако, прежде чем стек предоставится в распоряжение функции main, его уже что-то там скрытое от программиста с++ успевает поюзать? Типа, main свои переменные локальные располагает уже в б/у ? )) Ну то есть, я правильно понял: винда ещё при загрузке приложения уже вовсю эксплуатирует память этого самого приложения? |
24.12.2011, 02:52 | #40 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PopupMenu со мной не дружит | Жигилий_Ульяна | Компоненты Delphi | 5 | 25.12.2008 11:04 |
проблемы с select или со мной... | smoke888 | JavaScript, Ajax | 2 | 23.09.2008 19:02 |