2012-07-16 16 views
13

Estoy asumiendo (posiblemente erróneamente) que depende de la implementación y/o del sistema. ¿Hay algo como INT_MAX o CHAR_BIT que me diga el tamaño de un puntero en la memoria?¿Cuánta memoria usa un puntero C++?

+1

usted debe tener cuidado con los punteros de función miembro, ya que pueden tener distintos tamaños, a diferencia de los regulares. Ver http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible para más detalles sangrientos. –

Respuesta

28

Un puntero apunta a un lugar en la memoria, por lo que serían 32 bits en un sistema de 32 bits y 64 bits en el sistema de 64 bits.

tamaño de punteros también es irrelevante para el tipo que apunta a, y se puede medir por sizeof(anyType*)

UPD

La manera en que yo respondí esto fue sugerido por la forma en que se hizo la pregunta (que sugirió una respuesta simple). Sí, acepto que en casos como los punteros a la tabla de métodos virtuales, el tamaño del puntero será diferente, y de acuerdo con this article, variará en diferentes plataformas e incluso en diferentes compiladores dentro de la misma plataforma. En mi caso, por ejemplo (x64 ubuntu, GCC 4.6.3) es igual a 16 bytes.

+0

Por supuesto, qué sencillo, pero tan cierto. –

+2

incorrecto En el sistema operativo de 64 bits, aún puede tener su programa compilado en modo de 32 bits. –

+0

Cout'ed 'sizeof (int *)' y la respuesta fue '4'. ¿Eso significa 4 bytes? (algo interesante porque esta es una máquina de 64 bits). Estoy compilando con Visual C++. – HorseloverFat

5

¿Funcionaría sizeof(int*)? O lo que sea que estás destinado a verificar?

1

El tamaño del puntero depende de su sistema operativo (en realidad, la cantidad de bits del sistema operativo), intente con la función sizeof (tipo *).

+1

incorrecto En el sistema operativo de 64 bits, aún puede tener su programa compilado en modo de 32 bits. –

+0

@ icando ... ¿el tamaño del puntero depende del modo que está compilando? dar ejemplo – Tejendra

+0

@Tejendra - por ejemplo, Visual Studio tiene 2 modos - Win32 - para 32 bits, y uno, para x64 (se olvidó su nombre) –

2

Definitivamente depende del sistema. Por lo general, un puntero de datos simple se puede almacenar en una variable size_t. En C++ 11 hay macro SIZE_MAX que es el valor máximo para size_t. En C++ 11 también puede usar std::intptr_t.

Si tiene en cuenta los indicadores de funciones de los miembros, las cosas se complican aún más. Depende entre otras cosas si la clase hereda de uno o más padres, si expone funciones virtuales y, por supuesto, sobre la implementación.

Here puede encontrar un artículo detallado acerca de los punteros de función de miembro, junto con algunos ejemplos para algunos compiladores.

2

La respuesta para un caso simple como int* es directa y se da en otras respuestas.

Pero tenga en cuenta que los punteros miembros de objetos que usan herencia múltiple pueden contener varios (WORDs/DWORDs/QWORD), en el peor de los casos hasta 5 (cinco).

buen artículo sobre esto: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible

+0

¿Cómo puede afectar el tamaño de un puntero a la herencia múltiple? – EJP

+0

No es así. Como está escrito, la respuesta es simplemente incorrecta. Sospecho que el póster estaba pensando en los indicadores para los miembros, que pueden tener un tamaño claramente diferente al de otros indicadores. (Por supuesto, no hay ningún requisito de que todos los punteros tengan el mismo tamaño, incluso en C, y he trabajado en máquinas donde 'sizeof (int *)! = Sizeof (char *)', o donde los punteros a las funciones tienen una diferente tamaño que punteros a los datos.) –

+0

Actualmente no puedo escribir un mensaje más detallado. En unas pocas horas actualizaré mi publicación. –

-1
#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    printf(" %d",sizeof(int *)); 
    printf(" %d",sizeof(char *)); 
    printf(" %d",sizeof(float *)); 
    printf(" %d",sizeof(double *)); 
    getch(); 
} 
+0

usó este programa y muestra "2" como salida para todas las instrucciones printf. Entonces, si no estoy equivocado, un puntero toma 2 bytes ... –

+0

... solo en la computadora específica y supuestamente bastante antigua que usaste. No existe una regla sobre el tamaño, aunque en la mayoría de las computadoras contemporáneas, sin duda será diferente de 2. –

Cuestiones relacionadas