sintaxis funcion array c++ c sizeof

c++ - funcion - ¿Cómo sabe sizeof el tamaño de la matriz de operandos?



sizeof() c (12)

Cita de en.wikipedia.org/wiki/Sizeof :

Es responsabilidad del autor del compilador implementar el tamaño del operador de una manera específica y correcta para una implementación determinada del lenguaje. El operador sizeof debe tener en cuenta la implementación del esquema de asignación de memoria subyacente para obtener los tamaños de varios tipos de datos. sizeof suele ser un operador en tiempo de compilación, lo que significa que durante la compilación, sizeof y su operando son reemplazados por el valor-resultado. Esto es evidente en el código del lenguaje ensamblador producido por un compilador C o C ++. Por esta razón, sizeof califica como operador, aunque su uso a veces se parece a una llamada de función.

Esta puede ser una pregunta estúpida, pero ¿cómo sabe el operador sizeof el tamaño de un operando de matriz cuando no se pasa la cantidad de elementos en la matriz? Sé que no devuelve el total de elementos en la matriz, sino el tamaño en bytes, pero para obtener eso aún debe saber cuándo finaliza la matriz. Sólo curiosidad por cómo funciona esto.


El compilador conoce el tamaño de cada tipo en su aplicación, y sizeof solo le solicita al compilador que le genere ese valor.


El problema que subyace a su problema para entender esto podría ser porque está confundiendo arreglos y punteros, como muchos otros lo hacen. Sin embargo, las matrices no son punteros . Una double da[10] es una matriz de diez double , no double* , y eso es lo que el compilador conoce con certeza cuando se le pregunta evaluar el sizeof(da) . ¿No te sorprendería que el compilador sepa sizeof(double) ?

El problema con las matrices es que decaen a los punteros a sus primeros elementos automáticamente en muchos contextos (como cuando se pasan a las funciones). Pero aún así, la matriz son matrices y los punteros son punteros.


El tamaño del en.wikipedia.org/wiki/Sizeof "sabe" el tamaño de todos los tipos de datos atómicos, ya que las estructuras, uniones y matrices solo se pueden construir mediante el ensamblaje de los tipos atómicos, es fácil determinar el tamaño de la matriz de cualquier tipo. Utiliza aritmética básica para determinar tipos complejos (durante el tiempo de compilación).


Excepto en un caso, sizeof hace algo en tiempo de compilación. En el momento de la compilación, el compilador realiza un seguimiento del tipo completo de un objeto [Editar: bueno, todo lo que sabe sobre el tipo del objeto, de todos modos, si el tipo no está completo, por lo que no incluye el tamaño, intente el uso de sizeof fallará], y sizeof básicamente "exporta" una parte de esa información del compilador al código que se está compilando, por lo que se convierte esencialmente en una constante en el código resultante.

La excepción es cuando se aplica sizeof a la matriz de longitud variable (VLA) 1 . Cuando se aplica a un VLA, sizeof evalúa su operando (que no lo hace de otra manera), y produce el tamaño real del VLA. En este caso, el resultado no es una constante.

1. Los VLA se convirtieron oficialmente en parte de C en C99, pero algunos compiladores los apoyaron antes de eso. Aunque no es oficialmente parte de C ++, algunos compiladores (por ejemplo, g ++) incluyen VLA como una extensión de C ++ también.


Si está utilizando sizeof en una variable local, sabe cuántos elementos declaró. Si está utilizando sizeof en un parámetro de función, no lo sabe; trata el parámetro como un puntero a la matriz y sizeof da el tamaño de un puntero.


Sizeof siempre se evalúa en tiempo de compilación. En el compilador de varias pasadas, mientras se genera el compilador de la tabla de símbolos, se debe determinar el tamaño de cada símbolo declarado para continuar generando un código intermedio. Así que para todas las referencias de tamaño de código en el código reemplaza el valor exacto. En la etapa de generación de código intermedio, todos los operadores, las declaraciones se convierten a código intermedio correcto (ASM / otro formato). Finalmente, la etapa de generación de código m / c lo convierte al código máquina.

Algunas discusiones vistas anteriormente sobre las asignaciones dinámicas relacionadas con sizeof no están en absoluto en el contexto. Cualquier referencia al tamaño (* p) donde p es un puntero de cualquier tipo de datos, el compilador simplemente descubre el tipo de datos de * p y reemplaza su tamaño, no vaya a verificar el encabezado de MCB del bloque asignado para ver cuál es el valor asignado tamaño de la memoria. No es en tiempo de ejecución. Por ejemplo double * p; El tamaño de (* p) todavía se puede hacer sin asignar ninguna memoria para el puntero p. ¿Como es posible?


Sizeof solo se puede aplicar a tipos completamente definidos. El compilador podrá determinar el tamaño en el momento de la compilación (por ejemplo, si tiene una declaración como int foo [8];), o podrá determinar que tiene que agregar código para rastrear el tamaño de una variable -el array de longitud (por ejemplo, si tiene una declaración como int foo [n + 3];).

Contrariamente a otras respuestas aquí, tenga en cuenta que a partir de C99, sizeof () no se determina necesariamente en el momento de la compilación, ya que las matrices pueden ser de longitud variable.


sizeof se calcula en tiempo de compilación. Es por eso que cuando creas una matriz dinámica, la creas de la siguiente manera.

char * array; int size; //Get size somehow. array = malloc(size*(sizeof(char)));

// ahora, durante la compilación, el compilador sabe con certeza el tamaño de char. Ya que tiene que alinearlos en la memoria. En este punto, el sistema operativo sabe cuánto tamaño tiene que asignar.

Por otro lado, las matrices de longitud variable se crean en la pila . Pero cualquier memoria asignada a malloc se crearía en el montón.


Sizeof es un operador de tiempo de compilación; Tiene tanta información como el compilador. (Y obviamente el compilador sabe el tamaño de la matriz).

Por esta razón, si llama a sizeof en un puntero, obtendrá el ancho del puntero, no el tamaño de la matriz a la que apunta ese puntero.


sizeof se evalúa generalmente en tiempo de compilación. La excepción notable son las matrices de longitud variable de C99.

int main(int argc, char **argv) { if (argc > 1) { int count = atoi(argv[1]); int someArray[count]; printf("The size is %zu bytes/n", sizeof someArray); } else puts("No"); }


sizeof se interpreta en tiempo de compilación, y el compilador sabe cómo se declaró la matriz (y, por lo tanto, cuánto espacio ocupa). Llamar a sizeof en una matriz asignada dinámicamente probablemente no hará lo que quiere, porque (como usted menciona) no se especifica el punto final de la matriz.