Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на статическую внутреннюю переменную 
:(
    Опции темы
zkv
Дата 4.12.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  15:26 Найти цитируемый пост)
А я скажу, что - это некорректно.

ок, а что рождает сомнения? Изложи их, попробуем развеять.  smile 
PM MAIL   Вверх
Random13
Дата 4.12.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(zkv @ 4.12.2007,  15:23)
Цитата(Random13 @  4.12.2007,  15:07 Найти цитируемый пост)
В литературе по этому поводу ничего не читал никогда. 

В литературе обо всем не напишешь, можно еще и голову применять. 
К тому же тебе показали два примера, объяснили достоинства подхода, что еще нужно?

Если возможность недокументированная, значит опасная.

Если нет в ANSI, значит есть вероятность существования компилятора, в котором это не будет работать.
И какие могут быть претензии к создателю компилятора при этом, если этого нет в стандарте ?

Добавлено через 5 минут и 57 секунд
Первое сомнение изложил.
Второе, всегда в литературе почему-то работают с динамической памятью , где с указателем на статические внутренние переменные получается удобней.
PM MAIL   Вверх
Fazil6
Дата 4.12.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если недокументированная, значит опасная.

вернуть адрес из функции - то по твоему "возможность недокументированная" ?


PM MAIL   Вверх
zkv
Дата 4.12.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если возможность недокументированная, значит опасная.

Если нет в ANSI, значит есть вероятность существования компилятора, в котором это не будет работать.
И какие могут быть претензии к создателю компилятора при этом, если этого нет в стандарте ? 

чего это нет в стандарте? Там есть упоминание о том, что время жизни такой переменной - время выполнения программы? Есть. 
Значит она там будет всегда, когда бы мы к ней не обратились.
Да она сама (статическая переменная) не видна вне функции, в которой объявлена, и против этого  мы тоже не идем, мы ведь не пытаемся увеличить видимость переменной (дико звучит  smile ) а передаем на нее указатель/ссылку.
Что незаконного в действиях?

Цитата(Random13 @  4.12.2007,  15:37 Найти цитируемый пост)
Если возможность недокументированная, значит опасная.

теперь когда будешь говорить о недокументированности, уточняй, в каком именно месте мы расходимся с документацией  smile 
PM MAIL   Вверх
Lazin
Дата 4.12.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Статическая переменная внутри метода отличается от глобальной переменной(статической) только видимостью.
У Александресску хорошо описана эта проблема. Недостаток этого подхода(достоинство?) - тип переменной определен на этапе компиляции, и нельзя контролировать время жизни такой переменной. Могут быть траблы, если есть несколько статических переменных (не тривиальных типов) и одна обращается к другой в своем деструкторе, а та уже уничтожена.
PM MAIL Skype GTalk   Вверх
Earnest
Дата 4.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Lazin @  4.12.2007,  16:58 Найти цитируемый пост)
. Недостаток этого подхода(достоинство?) - тип переменной определен на этапе компиляции, и нельзя контролировать время жизни такой переменной. Могут быть траблы, если есть несколько статических переменных (не тривиальных типов) и одна обращается к другой в своем деструкторе, а та уже уничтожена

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


--------------------
...
PM   Вверх
bsa
Дата 4.12.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А разве деструкторы статических объектов вызываются не в порядке, обратном вызову конструкторов? Так реализовать проще, имхо.
PM   Вверх
Random13
Дата 4.12.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата(Earnest @ 4.12.2007,  15:23)
Более того, это шикарный прием для обхода проблемы "инициализации вовремя": как известно, порядок инициализации нормальных (внешних) глобальных или статических переменных из разных единиц компиляции неопределен. И легального способа добиться, чтобы переменная A была инициализирована гарантированно раньше переменной B не существует - если они в разных модулях. 

Т.е. мы получим проблему, если инициализация A зависит от B.
А если вместо глобальной переменной мы используем ссылку на статическую переменную внутри функции, то она гарантированно будет инициализирована ровно в момент первого вызова - т.е. когда нам надо. И это стандарт гарантирует.

Не совсем понятно.  Все глобальные переменные инициализируются до мейн(), функцию любую можно вызвать только после входа в мейн(). Ну или до мэйн() можно при создании глобального объекта вызвать внешнюю функцию из конструктора.
Тогда при чем тут порядок инициализации ? С тем же успехом можно либо в мэйн() вначале задать значение А, и В(А). Либо сделать это в той же функции при построении глобального объекта.
В общем интересно. Как-нить может сам набреду на пример.  smile 
PM MAIL   Вверх
zkv
Дата 4.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Random13, имеется ввиду нечто подобное:
Код

//1.cpp
Class1 g_val1;

//2.cpp
extern Class1 g_val1;

Class1 g_val2( g_val1 );//вот тут можно наступить на грабли, нельзя определенно сказать, будет в этот момент создан объект g_val1 или нет

ну и по аналогии со статическими переменными та же история.
PM MAIL   Вверх
bsa
Дата 4.12.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



вот о чем речь: файл aaa.cpp:
Код
#include <iostream>
struct A
{
        A() { std::cout << "A" << std::endl; }
};
A a;
файл bbb.cpp:
Код
#include <iostream>
struct B
{
        B() { std::cout << "B" << std::endl; }
};
B b;
int main()
{
        return 0;
}
файл ccc.cpp:
Код
#include <iostream>
struct C
{
        C() { std::cout << "C" << std::endl; }
};
C c;
А теперь скомпилируй их командой: g++ aaa.cpp bbb.cpp ccc.cpp и запусти, увидишь вывод:
Код
C
B
A
А если g++ ccc.cpp bbb.cpp aaa.cpp:
Код
A
B
C


PM   Вверх
Earnest
Дата 4.12.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Речь ведь идет не о вложенных напрямую объектах, а о том что переменная A в деструкторе за каким-то лешим лезет к переменной B, тоже статической. Т.к. порядок создания их не определен, точно так же не определен и порядок разрушения. То, что он обратный созданию, не спасает - при создании объекту A до объекта B может быть до лампочки.
Это был ответ bsa... про порядок вызова деструкторов ...

Это сообщение отредактировал(а) Earnest - 4.12.2007, 16:47


--------------------
...
PM   Вверх
Random13
Дата 4.12.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?
PM MAIL   Вверх
Earnest
Дата 4.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



По стандарту, статическая переменная внутри функции инициализируется при первом вызове этой функции. Т.е. если ты вызовешь эту функцию из конструктора другой глобальной переменной, то гарантированно наша статическая переменная будет уже готова к использованию.


--------------------
...
PM   Вверх
bsa
Дата 4.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Random13 @ 4.12.2007,  16:45)
Это понятно. Не понятно как указатель на внутреннюю статическую переменную, ну или пусть на глобальную статическую поможет проблему очередности решить ?

При вызове указанного метода/функции статическая переменная содержащаяся в нем уже инициализирована.
PM   Вверх
Earnest
Дата 4.12.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Более того, если функция не вызывается ни разу, переменная не будет инициализирована вообще. Что в некоторых случаях полезно.


--------------------
...
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.