Является ли стандарт C++ гарантией того, что два указателя на функцию всегда сравниваются одинаково? Я понимаю, что это обычно верно для не-встроенных функций. Но если есть встроенная функция, и указатель на функцию создается в двух отдельных единицах компиляции, будет ли компоновщик сливать два экземпляра, или разрешено ли выпустить дублирующие функции?Являются ли два указателя функций одинаковыми?
Если ответ на вышеизложенное равен «они равны»: сохраняется ли это, если есть общий заголовок с встроенной функцией, и как основная программа, так и динамически загружаемый плагин (общий объект/DLL) создают указатель на функцию?
Ваш последний вопрос верен только в домене того же процесса. Если DLL «разделяется» другими процессами, функция может иметь разные адреса в разных процессах (а код в DLL будет видеть разные адреса в зависимости от того, какой процесс вызывает его, причем каждый просмотр также представляет собой отдельное «состояние»). Более того, эти «четкие адреса» могут быть «изображениями» одного и того же физического ресурса (которые, таким образом, остаются совместно используемыми), тогда как «состояние» (сегмент данных) будет оставаться другим. –
Я думаю, что ваша формулировка довольно запутанна. Дело в том, что, беря адрес функции, вы никогда не получите «встроенную» копию. Вы получаете описание видимой внешне видимой функции. Это может даже использоваться для принудительного создания шаблона функции, даже если оно не используется иным образом. – sehe
@sehe: Это разумное приближение, но не обязательно истинное. Представьте себе компилятор с «хвостовой вставкой» - если последний оператор функции является «return f()», вставьте весь массив 'f()' и, возможно, поместите небольшой прыжок, чтобы пропустить некоторый код пролога. Теперь у вас есть встроенная функция f, которая также может быть автоматически вызвана. Указатель функции может указывать на эту встроенную копию. Это позволяет стандарт, не уточняя реализацию. Если допускаются такие странности, краткая формулировка часто бывает неточно. – MSalters