Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2011, 09:11   #1
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию адрес статической переменной

Господа, после бессонной ночи тихо недоумеваю:
Код:
int* adr()
{
    static int st = 0;
    return &st;
}
Возможно ли, чтобы в разных потоках вызывающих функцию adr вернулось разное значение адреса? Или я не выспался? )
EUGY вне форума Ответить с цитированием
Старый 14.08.2011, 09:39   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

думаю сильно зависит от компилятора. помоему MS умеет такое делать именно для статических переменных, даже если переменная не была явно объявлена __declspec(thread).
f.hump вне форума Ответить с цитированием
Старый 14.08.2011, 10:02   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Где-то я поймал трудно повторяемый баг и не вижу. Повторный вызов из разных потоков возвращает уже одинаковое значение.
EUGY вне форума Ответить с цитированием
Старый 14.08.2011, 15:48   #4
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

а я думал, что при доступе к любым данным из разных потоков необходима синхронизация..
впрочем это довольно маловероятно, статические переменные являются так сказать глобальными переменными, по этой же причине инициализируются в самом начале выполнения программы, хотя кто знает
alex_x_x вне форума Ответить с цитированием
Старый 14.08.2011, 15:51   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от alex_x_x Посмотреть сообщение
инициализируются в самом начале выполнения программы, хотя кто знает
не соглашусь, инициализируются они в момент первой их встречи компилятором.
onewho вне форума Ответить с цитированием
Старый 14.08.2011, 15:56   #6
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
не соглашусь, инициализируются они в момент первой их встречи компилятором.
всмысле, в страницы виртуальной памяти тоже компилятор пишет?
alex_x_x вне форума Ответить с цитированием
Старый 14.08.2011, 16:07   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А где Си хранит такие переменные?
По идее раз у автора разные адреса всплывают значит это разные переменные. так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2011, 16:43   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
всмысле, в страницы виртуальной памяти тоже компилятор пишет?
причем тут виртуальные страницы?
компиль либо инициализирует это сразу через секции данных.
либо же проверяя "была ли она инициализирована" и если надо инициализирует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.08.2011, 17:02   #9
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

секции кода, данных - понятия форматов PE, ELF итд, имеющих отношение к операционной системе
при старте процесса происходит проецирование его файла (EXE, по аналогии DLL) на страницы виртуальной памяти, устанавливая на страницы памяти нужные права (read-only, read-write, execute, etc..)
расположение секций и данных в них устанавливает линковщик (пускай вы имели в виду его, упоминая компилятор), но в run-time то не он этим занимается

Последний раз редактировалось alex_x_x; 14.08.2011 в 17:15.
alex_x_x вне форума Ответить с цитированием
Старый 14.08.2011, 17:19   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
но в run-time то не он этим занимается
тут надо препарировать exe и проверять, для простых типов пожалуй да(и состоящих из простых(структуры например, хотя и то наверно не без оговорок)), ибо это куда быстрее.
ну а объект инициализировать в статике(при построении имею в виду) не выйдет(особенно если через указатель он хранится)
Цитата:
секции кода, данных - понятия форматов PE, ELF итд, имеющих отношение к операционной системе
при старте процесса происходит проецирование его файла (EXE, по аналогии DLL) на страницы виртуальной памяти, устанавливая на страницы памяти нужные права (read-only, read-write, execute, etc..)
да знаю я это все
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Адрес переменной _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 16 30.12.2010 12:02
Адрес переменной _-Re@l-_ Общие вопросы .NET 3 25.12.2010 16:58
Адрес переменной kostyan777 Общие вопросы C/C++ 4 11.07.2010 22:16
Адрес переменной: Вопрос Black-Sparkle Общие вопросы C/C++ 11 11.08.2009 14:59
Адрес переменной Pedro Общие вопросы Delphi 11 16.12.2008 13:03