Ответ 1
C 2011 (проект Комитета N1570) 6.5.9 6: "Два указателя сравнивают одинаковые, если и только если... оба являются указателями на одну и ту же функцию... Итак, да, два указателя на одну и ту же функцию сравнивают равные.
Когда адрес функции берется в двух разных объектных модулях, компилятор помещает местозаполнитель в объектный код. Этот заполнитель заполняется, когда объектные модули связаны с исполняемым файлом или связаны с динамической библиотекой во время выполнения.
Для динамических библиотек либо динамический загрузчик заполняет все заполнители в исполняемом файле по мере необходимости, либо адрес каждой функции на самом деле является местоположением некоторого кода-заглушки, который перескакивает на фактическую функцию, и заполнителя, который используется или используется этим заглушкой код заполняется динамическим загрузчиком.
Кроме того, обратите внимание, что исполняемый файл может содержать более одного экземпляра функции. Компилятор может вставлять функцию inline в несколько мест или может, по своей собственной причине, включать специализацию функции, а также общую версию. Однако, когда адрес функции принимается, компилятор должен указать адрес одной общей версии. (Или компилятор должен убедиться, что программа ведет себя так, как если бы это было сделано. Например, если компилятор может обнаружить, что программа не сравнивает указатели, то теоретически она может использовать другой адрес для некоторых экземпляров адреса функции.)