Re[5]: Вопрос о статических переменных
От: Bell Россия  
Дата: 07.10.04 15:24
Оценка: 1 (1)
Здравствуйте, sevtov, Вы писали:

S>Согласен.

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

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

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


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


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


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


G>не будет прогнал прошу коллектив простить и дать возможность искупить кровью


В Чечню хочешь?
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[5]: Вопрос о статических переменных
От: kiamor  
Дата: 08.10.04 05:24
Оценка: -1
Здравствуйте, Павел Кузнецов.

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


Чрезвычайно провокационный вопрос. Да ещё от модератора. Неслыханно!
Но всё же отвечу

Watcom под QNX 4.x например. Речь идёт о 9 и предшественниках.
И уверяю Вас, уважаемый модератор, это не единственный такой пример.
Re[6]: Вопрос о статических переменных
От: sevtov  
Дата: 09.10.04 12:10
Оценка: :)
Здравствуйте, Bell, Вы писали:

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


B>Смысл в том, что глобальная переменная, объявленная как static, видна только в данном модуле (имеет внутреннюю компоновку).


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

есть 2 модуля

var.h :

static int variable;


main.cpp — юзает модуль var

#include "var.h"

int main()
{
   variable++;  // Нормально, хотя переменная variable - объявлена static в другом модуле.
}


variable++ не изменяет значение переменной variable в модуле var.
Вопрос о статических переменных
От: Аноним  
Дата: 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[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% в
соответствии со спецификацией... Да и за примерами далеко ходить не надо
Re[4]: Вопрос о статических переменных
От: Павел Кузнецов  
Дата: 07.10.04 19:36
Оценка:
kiamor:

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


> Хех, уважаемый... Если бы все компиляторы были реализованы на 100% в

> соответствии со спецификацией... Да и за примерами далеко ходить не надо

Приведи хотя бы один, который не проинициализирует эту переменную нулем.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Вопрос о статических переменных
От: Павел Кузнецов  
Дата: 08.10.04 20:53
Оценка:
kiamor:

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


> Watcom под QNX 4.x например. Речь идёт о 9 и предшественниках.


Что-то я не нашел подтверждений, что это, действительно, так. Мы оба говорим о статической инициализации? Watcom 9 не такой уж старый компилятор, чтобы не соответствовать даже самым ранним черновикам первого стандарта C
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[7]: Вопрос о статических переменных
От: Shady Россия  
Дата: 09.10.04 12:28
Оценка:
Здравствуйте, sevtov, Вы писали:

S>Написал маленький тест. Оказывается в пределах модуля скрывается не сама глобальная статическая переменная, а ее экземпляр. Т.е. в другом модуле можно использовать имя этой переменной, но не значение. На самом деле это уже будут совсем разные переменные.


S>есть 2 модуля


S>var.h :


S>
S>static int variable;
S>


S>main.cpp — юзает модуль var


S>
S>#include "var.h"

S>int main()
S>{
S>   variable++;  // Нормально, хотя переменная variable - объявлена static в другом модуле.
S>}
S>


S>variable++ не изменяет значение переменной variable в модуле var.


Это какой компилятор? Попахивает финтами ушами.
... << RSDN@Home 1.1.3 stable >>
"Man feed machine
Machine feed man"
Peter Gabriel — OVO — The Tower That Ate People
Re[7]: Вопрос о статических переменных
От: GarryIV  
Дата: 09.10.04 13:27
Оценка:
Hello, sevtov!

s> есть 2 модуля


s> var.h :


s>
 s> static int variable;
 s>


s> main.cpp — юзает модуль var


s>
 s> #include "var.h"

 s> int main()
 s> {
 s>    variable++;  // Нормально, хотя переменная variable - объявлена
 s> static в другом модуле. }
 s>


s> variable++ не изменяет значение переменной variable в модуле

s> var.

Нет никакого модуля var, var.h просто текстовый файл который включается в том месте где написать #include "var.h". В твоем примере ОДНА переменная variable. Соответственно она и меняется. Грубо говоря сколько раз ты напишешь (в разных cpp) #include "var.h" столько у тебя и будет переменных variable. И вне cpp эта переменная видна не будет. Об этом и говорил Bell.

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 gamma
WBR, Igor Evgrafov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.