Подтвердить что ты не робот

Всегда ли равны два указателя на одну и ту же функцию?

Стандарт С++ гарантирует, что два указателя на функцию всегда сравниваются одинаково? Я понимаю, что это обычно верно для не-встроенных функций. Но если есть встроенная функция, и указатель на функцию создается в двух отдельных единицах компиляции, будет ли компоновщик слить два экземпляра, или разрешено ли выпустить повторяющиеся функции?

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

4b9b3361

Ответ 1

В разделе 5.10/1 стандарта С++ 11 говорится:

Два указателя одного типа сравнивают одинаковые, если и только если они оба значения равны нулю, оба указывают на одну и ту же функцию или оба представляют одинаковые адрес

Две копии одной и той же функции inline по-прежнему являются одной и той же функцией. С точки зрения реализации компилятор будет генерировать копию функции в каждой единицы перевода, но компоновщик затем выбросит одну из копий, чтобы остался только один.

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

DLL находятся за пределами стандарта, но только одна копия функции останется в двоичном изображении, поэтому получение адреса функции (например, GetProcAddress) из DLL получит тот же указатель функции, что и код внутри DLL.

Ответ 2

Стандарт С++ гарантирует, что два указателя на функцию всегда сравните равные?

Да, два указателя, которые указывают на одну и ту же функцию, сравниваются с равными.

Сохраняется ли это, если есть общий заголовок с встроенным функции, и как основная программа, так и динамически загруженный плагин (общий объект /DLL ) создают указатель на функцию?

Да, за 7.1.2.p4

Встроенная функция с внешней связью должна иметь тот же адрес во всех единицах перевода.