Re[6]: Креш в синглтоне Мейерса
От: Bell Россия  
Дата: 27.11.07 12:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо. А если GetInstance будет internal, то её адрес и сам код тоже, как и её статические данные, будут свои для каждой единицы трансляции?

Да.

А>То есть полный копи/паст? Или это уже от компилятора зависит?

Полный копи/паст.
Любите книгу — источник знаний (с) М.Горький
Re[7]: Креш в синглтоне Мейерса
От: Аноним  
Дата: 27.11.07 13:19
Оценка:
Здравствуйте, Bell, Вы писали:

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


А>>Спасибо. А если GetInstance будет internal, то её адрес и сам код тоже, как и её статические данные, будут свои для каждой единицы трансляции?

B>Да.

А>>То есть полный копи/паст? Или это уже от компилятора зависит?

B>Полный копи/паст.

Спасибо за ликбез

Если Вам не надоели мои вопросы, то вот ещё
Для чего, в принципе, нужен internal linkage?
Для чего может понадобиться в каждом модуле дублировать код функций и константы?
Может это вынужденная мера языка, например, для поддержки шаблонов?
Re[8]: Креш в синглтоне Мейерса
От: Erop Россия  
Дата: 27.11.07 13:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Для чего может понадобиться в каждом модуле дублировать код функций и константы?

А>Может это вынужденная мера языка, например, для поддержки шаблонов?

1) internal l. в С++ лучше достигается не при помощи статических констант и функций, а при помощи анонимных пространств имён.
2) Ну вот представь себе, что написал ты что-то типа:
namespace {
struct MyData {
    int Id;
    const char* Text;
} table[] = {
    { 1, "I" }, 
    { 3, "a" }, 
    { 2, "am" }, 
    { 4, "student" }
};
}

но с external l. и в другом каком-то cpp напишешь другую табличку. Будет геморр и путанница какая табличка к кому относится.

А при internal l. всё изолировано и хорошо выходит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Креш в синглтоне Мейерса
От: Bell Россия  
Дата: 27.11.07 14:07
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Для чего, в принципе, нужен internal linkage?

Для изоляции некоей сущности в единице трансляции.
А>Для чего может понадобиться в каждом модуле дублировать код функций и константы?
Главная фишка в том, что под одним и тем же именем в разных единицах трансляции могут скрываться разные сущности . Например разные функции с одинаковым именем.
А вот копия константы — это совсем даже не плохо — можно вставить ее прямо в исполняемый код и забыть о ссылках не нее.

А>Может это вынужденная мера языка, например, для поддержки шаблонов?

Скорее наоборот. В качетсве параметров шаблонов могут использоваться только сущности с external linkage. А статические функции и константы в текущем стандарте помечены как устаревшие:

7.3.1.1/2
The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D);
the unnamed-namespace provides a superior alternative.

Т.е. для этой цели рекомедуется использовать безымянные пространства имен:
namespace
{
   void func() {};
}

В этом случае и имя изолировано, а значит не мешает другим идиницам трансляции, и функция func имеет внешнее связывание.
Любите книгу — источник знаний (с) М.Горький
Re[9]: Креш в синглтоне Мейерса
От: Аноним  
Дата: 27.11.07 14:38
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>Для чего может понадобиться в каждом модуле дублировать код функций и константы?

А>>Может это вынужденная мера языка, например, для поддержки шаблонов?

E>1) internal l. в С++ лучше достигается не при помощи статических констант и функций, а при помощи анонимных пространств имён.

E>2) Ну вот представь себе, что написал ты что-то типа:
namespace {
E>struct MyData {
E>    int Id;
E>    const char* Text;
E>} table[] = {
E>    { 1, "I" }, 
E>    { 3, "a" }, 
E>    { 2, "am" }, 
E>    { 4, "student" }
E>};
E>}

E>но с external l. и в другом каком-то cpp напишешь другую табличку. Будет геморр и путанница какая табличка к кому относится.

E>А при internal l. всё изолировано и хорошо выходит...


Ага, полезная штука, спасибо.
Re[9]: Креш в синглтоне Мейерса
От: Аноним  
Дата: 27.11.07 14:59
Оценка:
Здравствуйте, Bell, Вы писали:

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


А>>Для чего, в принципе, нужен internal linkage?

B>Для изоляции некоей сущности в единице трансляции.
А>>Для чего может понадобиться в каждом модуле дублировать код функций и константы?
B>Главная фишка в том, что под одним и тем же именем в разных единицах трансляции могут скрываться разные сущности . Например разные функции с одинаковым именем.
B>А вот копия константы — это совсем даже не плохо — можно вставить ее прямо в исполняемый код и забыть о ссылках не нее.

А>>Может это вынужденная мера языка, например, для поддержки шаблонов?

B>Скорее наоборот. В качетсве параметров шаблонов могут использоваться только сущности с external linkage. А статические функции и константы в текущем стандарте помечены как устаревшие:
B>

B>7.3.1.1/2
B>The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D);
B>the unnamed-namespace provides a superior alternative.

B>Т.е. для этой цели рекомедуется использовать безымянные пространства имен:
B>
B>namespace
B>{
B>   void func() {};
B>}
B>

B>В этом случае и имя изолировано, а значит не мешает другим идиницам трансляции, и функция func имеет внешнее связывание.

Занятно. Вроде разобрался. Традиционное спасибо
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.