sirven sencillos que punteros para operadores operaciones los lenguaje funciones ejemplos direccion con aritmetica c pointers type-conversion function-pointers sizeof

sencillos - ¿Qué se garantiza sobre el tamaño de un puntero de función?



punteros en c (4)

Además de las otras respuestas, Wikipedia dice esto:

http://en.wikipedia.org/wiki/Function_pointer

Aunque los punteros de función en C y C ++ pueden implementarse como direcciones simples, de modo que típicamente sizeof(Fx)==sizeof(void *) , los punteros de miembro en C ++ se implementan a menudo como "punteros gordos", típicamente dos o tres veces el tamaño de un puntero de función simple, para tratar con la herencia virtual.

Un puntero a la función es una abstracción. Siempre que se cumplan los requisitos de la norma, todo es posible. Es decir, si tiene menos de 256 funciones en su programa, los punteros a las funciones podrían implementarse utilizando un solo byte con el valor 0 para NULL y los valores de 1 a 255 como el índice en una tabla con las direcciones físicas. Si excede 255 funciones, podría extenderse para usar 2 bytes.

En C, necesito saber el tamaño de una estructura, que tiene punteros de función en ella. ¿Se me puede garantizar que en todas las plataformas y arquitecturas?

  • el tamaño de un vacío * es del mismo tamaño que un puntero a función?
  • el tamaño del puntero de función no difiere debido a su tipo de devolución?
  • el tamaño del puntero de función no difiere debido a sus tipos de parámetros?

Supongo que la respuesta es sí a todo esto, pero quiero estar seguro. Para el contexto, estoy llamando a sizeof(struct mystruct) y nada más.


De la especificación C99, sección 6.2.5, párrafo 27:

Un puntero a vacío tendrá los mismos requisitos de representación y alineación que un puntero a un tipo de carácter. De manera similar, los punteros a versiones cuali fi cadas o no calificadas de tipos compatibles deberán tener los mismos requisitos de representación y alineamiento. Todos los punteros a tipos de estructura deben tener los mismos requisitos de representación y alineación entre sí. Todos los punteros a tipos de unión tendrán los mismos requisitos de representación y alineación entre sí. Los punteros a otros tipos no necesitan tener los mismos requisitos de representación o alineación.

Entonces no; no hay garantía de que un void * pueda contener un puntero de función.

Y la sección 6.3.2.3, párrafo 8:

Un puntero a una función de un tipo se puede convertir en un puntero a una función de otro tipo y viceversa; el resultado se comparará igual al puntero original.

lo que implica que un tipo de puntero de función puede contener cualquier otro valor de puntero de función. Técnicamente, eso no es lo mismo que garantizar que los tipos de puntero a función no pueden variar en tamaño, simplemente que sus valores ocupan el mismo rango que el otro.


Hay un ejemplo práctico de tamaños diferentes que solían ser comunes. En la programación MS-DOS y principios de Windows C, en el modelo de memoria "medio" tenía punteros de datos de 16 bits pero punteros de función de 32 bits, y el modelo de memoria "compacta" era al revés.


No no no.

C no favorece las arquitecturas de Harvard con diferentes tamaños de punteros de código y datos, porque idealmente, cuando se programa para una arquitectura de este tipo, se desean almacenar datos en la memoria del programa (literales de cadenas y similares), y para hacer eso se necesitan punteros a objetos el espacio de código. Pero no les prohíbe, por lo que respecta al estándar, los punteros de función pueden referirse a un espacio de direcciones que tiene un tamaño diferente del espacio de direcciones de datos.

Sin embargo, cualquier puntero de función se puede convertir a otro tipo de puntero a función [*] y viceversa sin descartar el valor, de la misma manera que cualquier puntero de objeto se puede convertir a void* y viceversa. Por lo tanto, sería bastante sorprendente que los indicadores de función varíen en tamaño de acuerdo con su firma. No hay un "uso" obvio para el espacio extra, si tienes que poder almacenar de alguna manera el mismo valor en menos espacio y luego recuperarlo cuando lo rechaces.

[*] Gracias, schot.