Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 13:05
Оценка:
День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?
Re: Как создать объект раньше остальных?
От: Kubroid  
Дата: 28.08.07 13:22
Оценка: 6 (1)
Здравствуйте, slavo, Вы писали:

S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?

заюзать singleton.
Re: Как создать объект раньше остальных?
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 28.08.07 13:34
Оценка: +3
S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?

Самый надёжный вариант явно определить порядок создания объектов, и не злоупотреблять глобализмами.
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[2]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 13:38
Оценка:
Здравствуйте, Kubroid, Вы писали:

K>заюзать singleton.


а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку:
static CClass MyObject;


то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.
Re: Как создать объект раньше остальных?
От: Lorenzo_LAMAS  
Дата: 28.08.07 13:40
Оценка: 6 (1)
Здравствуйте, slavo, Вы писали:

S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


Поместить определение этого объекта до всех остальных. При этом надо учесть, что это будет работать только для одной единицы трансляции.
Of course, the code must be complete enough to compile and link.
Re[3]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 13:45
Оценка:
Здравствуйте, slavo, Вы писали:

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


K>>заюзать singleton.


S>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку:

S>
S>static CClass MyObject;
S>


S>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.


Проверил, так не работает.
Re[3]: Как создать объект раньше остальных?
От: Аноним  
Дата: 28.08.07 13:45
Оценка:
Здравствуйте, slavo, Вы писали:

K>>заюзать singleton.

S>а если не юзать singleton?
А аргументы против этого метода имеются?
Re[3]: Как создать объект раньше остальных?
От: Lorenzo_LAMAS  
Дата: 28.08.07 13:45
Оценка:
S>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.

Кто у тебя будет вызывать эти функции ?
Of course, the code must be complete enough to compile and link.
Re: Как создать объект раньше остальных?
От: Кодт Россия  
Дата: 28.08.07 13:54
Оценка:
Здравствуйте, slavo, Вы писали:

S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


Гарантированно — никак.
А зачем?
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 14:04
Оценка:
Здравствуйте, Аноним, Вы писали:

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


K>>>заюзать singleton.

S>>а если не юзать singleton?
А>А аргументы против этого метода имеются?

Возможно будет медленнее работать из-за потерь на вход в критическую секцию и проверку флага создания.
Re[4]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 14:05
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

S>>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.


L_L>Кто у тебя будет вызывать эти функции ?


Функции вызываются кем угодно. Экземпляры любых других классов теоритически могут их вызывать.
Re[2]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 14:07
Оценка:
Здравствуйте, Кодт, Вы писали:

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


S>>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


К>А зачем?


Чтобы гарантированно его использовать тогда, когда это потребуется.

К>Гарантированно — никак.


В крайнем случае это будет singleton.
Re[3]: Как создать объект раньше остальных?
От: alzt  
Дата: 28.08.07 14:51
Оценка:
Здравствуйте, slavo, Вы писали:

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


K>>заюзать singleton.


S>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку:

S>
S>static CClass MyObject;
S>


S>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.


Гарантированно нельзя. Порядок создания объектов для разных модулей не определён.
Синглетон тоже не подойдёт, т.к. по идее он должен создаваться по требованию в единственном числе, а не раньше всех.
Да и не понятно зачем создавать объект гарантированно раньше других.
Может вам надо создать раньше других объектов того же типа?
Re[4]: Как создать объект раньше остальных?
От: slavo  
Дата: 28.08.07 15:17
Оценка:
Здравствуйте, alzt, Вы писали:

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


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


K>>>заюзать singleton.


S>>а если не юзать singleton? У меня есть набор статических функций, которые реализованы в файле х.срр. Мой объект должен быть создан до обращения к любой из этих функций. Если я напишу в файле х.срр строку:

S>>
S>>static CClass MyObject;
S>>


S>>то гарантирует ли это то, что объект будет создан до обращения к этим функциям? Они ведь в одном объектном файле.


A>Гарантированно нельзя. Порядок создания объектов для разных модулей не определён.

A>Синглетон тоже не подойдёт, т.к. по идее он должен создаваться по требованию в единственном числе, а не раньше всех.
A>Да и не понятно зачем создавать объект гарантированно раньше других.
A>Может вам надо создать раньше других объектов того же типа?

singleton проблему решает, просто не хотелось постоянно дергать GetInstance. Но видно, никуда не деться. Сделал singleton.
Re[5]: Как создать объект раньше остальных?
От: alzt  
Дата: 28.08.07 15:26
Оценка:
Здравствуйте, slavo, Вы писали:

S>singleton проблему решает, просто не хотелось постоянно дергать GetInstance. Но видно, никуда не деться. Сделал singleton.


А каким образом он решает проблему? Можно пример кода?
Re: Как создать объект раньше остальных?
От: bkat  
Дата: 28.08.07 15:28
Оценка: 4 (1) +1
Здравствуйте, slavo, Вы писали:

S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


В общем случае никак.
С глобальными и статическими данными можно всегда так извратиться,
что будет не так, как тебе хочется.

Определи лучше у себя в системе некую функцию Init
в которой ты вручную будешь все, что требуется, сам инициализировать.
Re[3]: Как создать объект раньше остальных?
От: Кодт Россия  
Дата: 28.08.07 15:33
Оценка: 6 (1)
Здравствуйте, slavo, Вы писали:

К>>А зачем?

S>Чтобы гарантированно его использовать тогда, когда это потребуется.

Неполный ответ. Когда потребуется — это когда?

Две разных ситуации:

1) Нужно получить гарантии, что объект инициализируется до первого явного обращения к нему.
Да, это синглетон. Причём оба штатных С++ных синглетона — глобальная переменная и синглетон Майерса — это обеспечивают. Для более навороченных случаев (потокобезопасность, хитрые политики управления жизнью и смертью) — можно написать и хитрые синглетоны.

И то, при создании кольцевых зависимостей получишь лотерею.
extern int x, y, z, t;
.....

// компилятор с линкером разрулят, что y зависит от x
int x = printf("initialize x\n")+rand();
.....
int y = printf("initialize y\n")+x;

// кольцевая зависимость
int z = printf("initialize z\n")+t;
.....
int t = printf("initialize t\n")+z;


2) Нужно получить гарантии, что код (конструктора) вызовется до определённого момента.
Например, это регистратор метаданных, фабрики класса и т.п.
Так вот, здесь уж точно
К>>Гарантированно — никак.

После определённого момента — элементарно.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Как создать объект раньше остальных?
От: remark Россия http://www.1024cores.net/
Дата: 28.08.07 15:50
Оценка: 4 (1) +2 :)))
Здравствуйте, slavo, Вы писали:

S>>>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


К>>А зачем?


S>Чтобы гарантированно его использовать тогда, когда это потребуется.


Это называется "что будет, если всёпробивающее ядро попадёт в непробиваемую стену?"

А что будет если появится ещё один такой объект? Произойдёт коллапс проекта?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Как создать объект раньше остальных?
От: Андрей Коростелев Голландия http://www.korostelev.net/
Дата: 28.08.07 16:01
Оценка: 6 (1)
Здравствуйте, slavo, Вы писали:

S>День добрый, как гарантированно создать экземпляр класс CClass раньше, чем создастся экземпляр любого другого класса?


Идиома Schwarz Counter позволяет обеспечить гарантированный порядок инициализации объектов со static storage duration.
-- Андрей
Re[5]: Как создать объект раньше остальных?
От: Кодт Россия  
Дата: 28.08.07 16:23
Оценка:
Здравствуйте, slavo, Вы писали:

K>>>>заюзать singleton.

S>>>а если не юзать singleton?
А>>А аргументы против этого метода имеются?

S>Возможно будет медленнее работать из-за потерь на вход в критическую секцию и проверку флага создания.


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

Вот не факт, что синглетон — это то, что вообще нужно.
До тех пор, пока ты не раскроешь карты, слова "синглетон" и "гарантии" — не более чем buzzword.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.