Вопрос о статических переменных
От: Аноним  
Дата: 07.10.04 12:32
Оценка:
Есть такая программа.

#include "stdafx.h"
static char sc;

int _tmain(int argc, _TCHAR* argv[])
{

return 0;
}

В какой момент выделяется память для переменной sc, когда и как она инициализируется?
Re: Вопрос о статических переменных
От: _nn_ www.nemerleweb.com
Дата: 07.10.04 12:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая программа.


А>#include "stdafx.h"

А>static char sc;

А>int _tmain(int argc, _TCHAR* argv[])

А>{

А> return 0;

А>}

А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?


До вызова main происходит инициализация глобальных переменных.
Можно кое-что почитать здесь
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Вопрос о статических переменных
От: kiamor  
Дата: 07.10.04 13:16
Оценка:
Здравствуйте, Аноним.

А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?


Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.
Re[2]: Вопрос о статических переменных
От: achp  
Дата: 07.10.04 14:02
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.


Не-а! Согласно определениям обоих языков (Си и Си++), не инициализированный явно объект в данном случае будет инициализирован по умолчанию, что в случае встроенного типа означает нуль-инициализацию.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re: Вопрос о статических переменных
От: Glоbus Украина  
Дата: 07.10.04 14:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая программа.


А>#include "stdafx.h"

А>static char sc;

А>int _tmain(int argc, _TCHAR* argv[])

А>{

А> return 0;

А>}

А>В какой момент выделяется память для переменной sc, когда и как она инициализируется?



Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.
Удачи тебе, браток!
Re[2]: Вопрос о статических переменных
От: Bell Россия  
Дата: 07.10.04 14:23
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>... проинициализировано она будет до входа в мейн

Это верно.

G>...и будет там в ней мусор если не ошибаюсь.

А вот тут ошибаешься
3.6.2/1
The storage for objects with static storage duration (3.7.1) shall be zero-initialized
(8.5) before any other initialization takes place.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Вопрос о статических переменных
От: mefrill Россия  
Дата: 07.10.04 14:32
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.


Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором
Re[3]: Вопрос о статических переменных
От: achp  
Дата: 07.10.04 14:33
Оценка:
Здравствуйте, Bell, Вы писали:

G>>... проинициализировано она будет до входа в мейн

B>Это верно.

Верно, не недостаточно сильно.

Проинициализирован объект будет не только что до входа в main, но и до начала всякой динамической инициализации.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[2]: Вопрос о статических переменных
От: LaptevVV Россия  
Дата: 07.10.04 14:36
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Такая переменная будет отнесена к области неинициализированных переменных процесса после загрузки его в память. (Аналог — сегмент BSS в DOS'е). Чем она будет проинициализирована зависит и от компилятора/линкера и от платформы. Если компилятор обнуляет все неинициализированные переменные — значит будет 0. Если нет — будет то, что содержится в памяти, отведённой под эту переменную при размещении процесса. Если ОС обнуляет память выделяемую процессу (запрошенную процессом) — тогда будет 0. Иначе — может быть случайное значение.

По стандарту — ноль! И VC++.NET 2003 именно это и делает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос о статических переменных
От: LaptevVV Россия  
Дата: 07.10.04 14:37
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Здравствуйте, Glоbus, Вы писали:


G>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.


M>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором

Не-а. Там будет 0! А если не ноль — выкиньте тот компилятор!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос о статических переменных
От: Glоbus Украина  
Дата: 07.10.04 14:45
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Glоbus, Вы писали:


G>>... проинициализировано она будет до входа в мейн

B>Это верно.

G>>...и будет там в ней мусор если не ошибаюсь.

B>А вот тут ошибаешься
B>
B>3.6.2/1
B>The storage for objects with static storage duration (3.7.1) shall be zero-initialized
B>(8.5) before any other initialization takes place.
B>


да, сто пуд, прогнал
Удачи тебе, браток!
Re[3]: Вопрос о статических переменных
От: Glоbus Украина  
Дата: 07.10.04 14:46
Оценка:
Здравствуйте, mefrill, Вы писали:

M>Здравствуйте, Glоbus, Вы писали:


G>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.


M>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором


не будет прогнал прошу коллектив простить и дать возможность искупить кровью
Удачи тебе, браток!
Re[2]: Вопрос о статических переменных
От: sevtov  
Дата: 07.10.04 15:07
Оценка:
G>Память будет выделена на этапе компиляции.

Шутишь?
Re[3]: Вопрос о статических переменных
От: LaptevVV Россия  
Дата: 07.10.04 15:12
Оценка:
Здравствуйте, sevtov, Вы писали:



G>>Память будет выделена на этапе компиляции.


S>Шутишь?

Нет. Статические переменные распределяются как в фортране — на этапе компиляции.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос о статических переменных
От: Bell Россия  
Дата: 07.10.04 15:16
Оценка:
Здравствуйте, sevtov, Вы писали:



G>>Память будет выделена на этапе компиляции.


S>Шутишь?

Думаю, что коллега Globus подразумевал сегмент данных.
Любите книгу — источник знаний (с) М.Горький
Re[4]: Вопрос о статических переменных
От: achp  
Дата: 07.10.04 15:16
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Статические переменные распределяются как в фортране — на этапе компиляции.


Но выделяются на этапе загрузки.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[4]: Вопрос о статических переменных
От: sevtov  
Дата: 07.10.04 15:19
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, mefrill, Вы писали:


M>>Здравствуйте, Glоbus, Вы писали:


G>>>Память будет выделена на этапе компиляции. проинициализировано она будет до входа в мейн и будет там в ней мусор если не ошибаюсь.


M>>Т.е., из сказанного логически вытекает, что проинициализирована эта переменная будет мусором

LVV>Не-а. Там будет 0! А если не ноль — выкиньте тот компилятор!

Согласен.
Все глобальные и статические переменные располагаются в некоторой заранее отведенной статической памяти (в отличие от локальных переменных, которые располагаются в стеке). И простые глобальные переменные и статические глоб. переменные видны в пределах всего модуля, а если подключить файл с глоб. перем. к другому модулю, то будут видны и там.
Я клоню к тому, какой смысл вообще объявлять глоб. переменную с ключом static? По всей видимости глобальные перем. также инициализируются нулем, как и статические. Тогда в чем разница?
Re[5]: Вопрос о статических переменных
От: Bell Россия  
Дата: 07.10.04 15:24
Оценка: 1 (1)
Здравствуйте, sevtov, Вы писали:

S>Согласен.

S>Все глобальные и статические переменные располагаются в некоторой заранее отведенной статической памяти (в отличие от локальных переменных, которые располагаются в стеке). И простые глобальные переменные и статические глоб. переменные видны в пределах всего модуля, а если подключить файл с глоб. перем. к другому модулю, то будут видны и там.
S>Я клоню к тому, какой смысл вообще объявлять глоб. переменную с ключом static? По всей видимости глобальные перем. также инициализируются нулем, как и статические. Тогда в чем разница?

Смысл в том, что глобальная переменная, объявленная как static, видна только в данном модуле (имеет внутреннюю компоновку).
Любите книгу — источник знаний (с) М.Горький
Re[4]: Вопрос о статических переменных
От: LaptevVV Россия  
Дата: 07.10.04 15:24
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, sevtov, Вы писали:




G>>>Память будет выделена на этапе компиляции.


S>>Шутишь?

B>Думаю, что коллега Globus подразумевал сегмент данных.
А, понятно.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Вопрос о статических переменных
От: kiamor  
Дата: 07.10.04 15:48
Оценка:
Здравствуйте, achp.

A>Не-а! Согласно определениям обоих языков (Си и Си++)...


Хех, уважаемый... Если бы все компиляторы были реализованы на 100% в
соответствии со спецификацией... Да и за примерами далеко ходить не надо
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.