programas ejemplos avanzados c++ function-pointers

avanzados - ejemplos de programas en c++ pdf



¿Los dos punteros de función a la misma función son siempre iguales? (2)

¿El estándar de C ++ garantiza que dos punteros a una función siempre se comparan igual?

Sí, dos punteros que apuntan a la misma función se comparan iguales.

¿Se mantiene esto si hay un encabezado común con una función en línea, y tanto el programa principal como un complemento cargado dinámicamente (objeto compartido / DLL) crean un puntero a la función?

Sí, según 7.1.2.p4

Una función en línea con enlace externo tendrá la misma dirección en todas las unidades de traducción.

¿El estándar de C ++ garantiza que dos punteros a una función siempre se comparan igual? Entiendo que esto normalmente será cierto para las funciones no en línea. Pero si hay una función en línea y se crea un puntero a la función en dos unidades de compilación separadas, ¿el vinculador combinará las dos instancias o se le permite emitir funciones duplicadas?

Si la respuesta a lo anterior es "son iguales": ¿Esto sigue siendo válido si hay un encabezado común con una función en línea, y tanto el programa principal como un complemento cargado dinámicamente (objeto compartido / DLL) crean un puntero a la función? ?


La sección §5.10 / 1 de la norma C ++ 11 dice:

Dos punteros del mismo tipo se comparan igual si y solo si ambos son nulos, ambos apuntan a la misma función, o ambos representan la misma dirección

Dos copias de la misma función en inline siguen siendo la misma función. Desde el punto de vista de la implementación, el compilador generará una copia de la función en cada unidad de traducción, pero el enlazador desechará una de las copias y solo quedará una.

Al tomar la dirección de una función, evita que esté en línea (a diferencia de la inline , que es más acerca de evitar la violación de la Regla de definición única).

Las DLL están fuera del alcance del estándar, pero solo una copia de la función permanecerá en la imagen binaria, por lo que al obtener la dirección de la función (por ejemplo, GetProcAddress ) de la DLL se obtendrá el mismo puntero a la función que el código dentro de la DLL.