2012-05-17 2 views
2

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

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

ответ

2

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

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

+0

* Функция в неназванном пространстве имен может быть отброшена без влияния на программу * - Да, но так ли? Вы знаете, что компиляторы действительно это делают? – baruch

+0

@baruch: Да, gcc делает это на уровнях оптимизации> = '-O1'. –

Смежные вопросы