¿Existen limitaciones de tamaño para las estructuras C?
¿Existen limitaciones de tamaño para las estructuras C?
Nemo
alexey frunze
Del estándar C:
5.2.4.1 Límites de traducción
1 La implementación deberá poder traducir y ejecutar al menos un programa que contenga al menos una instancia de cada uno de los siguientes límites:
… — 65535 bytes en un objeto (solo en un entorno alojado)
… — 1023 miembros en una sola estructura o sindicato
… — 63 niveles de estructura anidada o definiciones de unión en una sola lista de declaración de estructura … 13) Las implementaciones deben evitar imponer límites de traducción fijos siempre que sea posible.
Aparte de eso, el límite superior es SIZE_MAX
(valor máximo para size_t
).
Blagovest Büyükliev
Desde el sizeof
operador produce un resultado de tipo size_t
el límite debe ser SIZE_MAX
.
Puede determinar el valor de SIZE_MAX
Me gusta esto:
#include <stdint.h>
#include <stdio.h>
int main (void) {
printf("%zu", SIZE_MAX);
return 0;
}
Esto es lo que el compilador debería permitir. Lo que permite el entorno de tiempo de ejecución es otra historia.
Declarar un objeto de tamaño similar en la pila (localmente) en la práctica no funcionará ya que la pila es probablemente mucho, mucho más pequeña que SIZE_MAX
.
Tener un objeto de este tipo globalmente podría hacer que el cargador ejecutable se queje al iniciar el programa.
-
¿Puede decir cuál es el valor probable de SIZE_MAX? ¿Es dependiente del sistema operativo? quiero saber el valor exacto.
– Nemo
11 de octubre de 2011 a las 10:54
-
Tengo mucha curiosidad sobre qué tamaño quieres usar y por qué. ¿Dinos?
– José
11/10/2011 a las 10:55
-
Al menos en teoría. En la práctica, el límite es la memoria de la computadora, que es mucho más pequeña que
SIZE_MAX
en una computadora moderna de 64 bits.– Un tipo programador
11 de octubre de 2011 a las 10:57
-
@Nemo Verifique el archivo de encabezado stdint.h, debería estar allí.
– Un tipo programador
11 de octubre de 2011 a las 10:57
-
@Nemo: SIZE_MAX depende del compilador/arquitectura, lo que significa que también depende del sistema operativo, en términos generales. Consulte su definición en stdint.h (o, si no está allí, posiblemente en limits.h) en los archivos de encabezado de su compilador.
– Alexei Frunze
11 de octubre de 2011 a las 11:02
Análisis empírico
En la práctica, las implementaciones como GCC parecen permitir solo estructuras más pequeñas que size_t
tal vez obligado por PTRDIFF_MAX
. Ver también: ¿Cuál es el tamaño máximo de una matriz en C?
Utilizando:
for i in `seq 32`; do printf "typedef struct { S$i x; S$i y; } S$(($i+1));\n"; done
Hacemos el programa:
#include <stdint.h>
#include <stdio.h>
typedef struct { uint8_t i; } S0;
typedef struct { S0 x; S0 y; } S1;
typedef struct { S1 x; S1 y; } S2;
typedef struct { S2 x; S2 y; } S3;
typedef struct { S3 x; S3 y; } S4;
typedef struct { S4 x; S4 y; } S5;
typedef struct { S5 x; S5 y; } S6;
typedef struct { S6 x; S6 y; } S7;
typedef struct { S7 x; S7 y; } S8;
typedef struct { S8 x; S8 y; } S9;
typedef struct { S9 x; S9 y; } S10;
typedef struct { S10 x; S10 y; } S11;
typedef struct { S11 x; S11 y; } S12;
typedef struct { S12 x; S12 y; } S13;
typedef struct { S13 x; S13 y; } S14;
typedef struct { S14 x; S14 y; } S15;
typedef struct { S15 x; S15 y; } S16;
typedef struct { S16 x; S16 y; } S17;
typedef struct { S17 x; S17 y; } S18;
typedef struct { S18 x; S18 y; } S19;
typedef struct { S19 x; S19 y; } S20;
typedef struct { S20 x; S20 y; } S21;
typedef struct { S21 x; S21 y; } S22;
typedef struct { S22 x; S22 y; } S23;
typedef struct { S23 x; S23 y; } S24;
typedef struct { S24 x; S24 y; } S25;
typedef struct { S25 x; S25 y; } S26;
typedef struct { S26 x; S26 y; } S27;
typedef struct { S27 x; S27 y; } S28;
typedef struct { S28 x; S28 y; } S29;
typedef struct { S29 x; S29 y; } S30;
/*typedef struct { S30 x; S30 y; } S31;*/
S30 s;
int main(void) {
printf("%jx\n", (uintmax_t)sizeof(s));
return 0;
}
y luego en Ubunbu 17.10:
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ arm-linux-gnueabi-gcc -std=c99 main.c
obras. Pero si descomentamos S31
falla con:
main.c:35:16: error: type ‘struct <anonymous>’ is too large
typedef struct { S30 x; S30 y; } S31;
Entonces, el tamaño máximo está entre 2^30 y (2^31 – 1).
Entonces podemos convertir S30
para:
typedef struct { S29 x; S29 y; uint8_t a[(2lu << 29) - 1]; } S30;
y con eso determinamos que el tamaño máximo es en realidad 2^31 - 1 == PTRDIFF_MAX
sobre esta implementación.
¿Te refieres al tamaño físico en la memoria o al número de miembros?
– Un tipo programador
11/10/2011 a las 10:50
Tamaño físico en la memoria.
– Nemo
11/10/2011 a las 10:51
Si tiene esta consideración, ¿tal vez usar una estructura es la forma incorrecta?
– AndersK
11 de octubre de 2011 a las 10:58
sí, tamaño físico en la memoria.
– Scott.N
22 de marzo de 2013 a las 10:15