tamaño de un tipo de datos sin usar sizeof

4 minutos de lectura

[*]
sud03r

Tengo un tipo de datos, digamos Xy quiero saber su tamaño sin declarar una variable o puntero de ese tipo y por supuesto sin usar sizeof operador.

es posible? Pensé en usar archivos de encabezado estándar que contienen tamaño y rango de tipos de datos, pero eso no funciona con el tipo de datos definido por el usuario.

  • ¿Qué quieres decir con “por supuesto sin usar sizeof”? ¿Por qué por supuesto?

    – John Kugelmann

    2 de agosto de 2009 a las 16:25

  • Al ser un acertijo, tienes que encontrar un método inusual y posiblemente absurdo para hacerlo. Mira mi respuesta.

    – Stefano Borini

    2 de agosto de 2009 a las 16:29

  • Pregunta de seguimiento: quiero incluir un archivo de encabezado que escribí, sin usar ninguna directiva de preprocesador, por supuesto. ¿Cómo puedo hacer eso?

    – John Kugelmann

    2 de agosto de 2009 a las 16:35

  • ¿Por qué importa si esta persona debe usar algo o no? La pregunta es cómo hacerlo sin usar sizeof y podemos ser útiles para responderla o no. ¿A quién le importa si arruinará una pregunta de la entrevista? El objetivo de este sitio web es ayudar a los demás, no desmenuzar una pregunta hasta que se ajuste a lo que queremos.

    – Mike B.

    5 de agosto de 2009 a las 15:29

  • Siguiente en esta serie: cómo obtener la dirección de sin usar un ampersand. ¡Manténganse al tanto!

    – salvaje

    5 de junio de 2012 a las 11:45

En mi opinión, esto encaja en la categoría de “¿cómo agrego dos enteros sin usar ++, += o +?”. Es una pérdida de tiempo. Puedes intentar evitar los monstruos de comportamiento indefinido haciendo algo como esto.

size_t size = (size_t)(1 + ((X*)0));

Tenga en cuenta que yo no declarar una variable de tipo o puntero a X.

  • @Stephano: puede que sea lo más horrible que hayas visto en tu vida, pero también es más o menos cómo se implementa típicamente offsetof…

    –Steve Jessop

    2 de agosto de 2009 a las 18:05

  • Si bien se garantiza que 0 significa “puntero nulo” en todas las implementaciones, no tiene que estar representado internamente por la dirección 0, en cuyo caso esto fallará. El C-FAQ afirma que existen tales máquinas c-faq.com/null/mahexamp.html pero no son nada que puedas encontrar. Respuesta inteligente, por cierto. 🙂

    – Tyler McHenry

    5 de agosto de 2009 a las 15:58

  • @Charles Balley esta pregunta se hace en las entrevistas de Cisco. No es una pérdida de tiempo y tampoco es una pregunta estúpida.

    – Usuario registrado

    17 de junio de 2011 a las 11:13


  • (X*)0 produce un puntero nulo. La aritmética en un puntero nulo tiene un comportamiento indefinido.

    –Keith Thompson

    21 de febrero de 2017 a las 22:20

  • @KeithThompson: Vaya… ¡sí! ((Mantengo mi comentario para que otros no hagan la misma pregunta, o no apliquen la misma técnica directamente en C++, ya que el sistema de tipos de C++ es un poco más complejo))

    – Nawaz

    22 de febrero de 2017 a las 2:21


avatar de usuario
dmckee — gatito ex-moderador

Mirar, sizeof es la facilidad de idioma para esto. El único, por lo que es la única forma portátil de lograrlo.

Para algunos casos especiales, podría generar un código no portátil que usara alguna otra heurística para comprender el tamaño de objetos particulares.[*] (probablemente haciéndoles realizar un seguimiento de su propio tamaño), pero usted mismo tendría que hacer toda la contabilidad.

[*] Objetos en un sentido muy general en lugar del sentido OOP.

avatar de usuario
chicle

Bueno, soy un aficionado… pero probé este problema y obtuve la respuesta correcta sin usar sizeof. Espero que esto ayude … Estoy tratando de encontrar el tamaño de un número entero.

int *a,*s, v=10;

a=&v;

s=a;

a++;

int intsize=(int)a-(int)s;

printf("%d",intsize);

  • Pero la pregunta sobre hacer esto sin declarando una variable o un puntero a una variable del tipo en cuestión….

    – ad absurdum

    10/09/2018 a las 12:50

La respuesta correcta a esta pregunta de la entrevista es “¿Por qué querría hacer eso, cuando sizeof() lo hace por mí y es el único método portátil para hacerlo?”

La posibilidad de relleno impide todas las esperanzas sin el conocimiento de las reglas utilizadas para su introducción. Y esos son dependientes de la implementación.

avatar de usuario
norman ramsey

Podrías descifrarlo leyendo el ITB para su procesador en particular, lo que explica cómo se distribuyen las estructuras en la memoria. Es potencialmente diferente para cada procesador. Pero a menos que esté escribiendo un compilador, es sorprendente que no quiera usar solo sizeofque es la forma correcta de resolver este problema.

si X es tipo de datos:

#define SIZEOF(X) (unsigned int)( (X *)0+1 )

si X es una variable:

#define SIZEOF(X) (unsigned int)( (char *)(&X+1)-(char *)(&X) )

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad