2011-10-20 8 views
5

Supongamos que tengo dos punteros para escribir T:¿Cuál es la restricción de distancia entre punteros de cierto tipo en C++?

T* first = ...// whatever 
T* second = ... //whatever else 

puedo estar seguro de que la distancia entre los dos punteros nunca puede exceder:

((size_t)(-1))/sizeof(T)?

+0

No lo creo, depende de cómo y cuándo se asigna la memoria para estos 2 objetos T – Ankur

+0

Creo que eso es cierto siempre que 'size_t' sea al menos tan grande como el puntero. Pero no estoy seguro de si se garantiza que 'size_t' sea al menos del tamaño de un puntero. Que alguien me corrija si me equivoco. – Mysticial

+0

@Mystical: ¿qué quiere decir con "tamaño de un puntero"? El tamaño de un puntero suele ser de 4 u 8 bytes. – jalf

Respuesta

13

Solo puede calcular la distancia entre dos punteros (restar un puntero a otro) si ambos punteros apuntan a elementos en la misma matriz, o a un extremo del mismo conjunto.

Si los dos punteros cumplen con esa restricción, entonces sí, el valor absoluto de la diferencia entre los dos punteros puede no exceda ((size_t)(-1))/sizeof(T) porque size_t debe ser lo suficientemente amplia como para representar el tamaño de cualquier objeto en bytes.

Si los dos punteros no cumplen con esa restricción, entonces no hay garantía en absoluto.

+0

No estoy de acuerdo con esta respuesta. ¿Qué uso de 'ptrdiff_t' entonces? – Nawaz

+5

Dado 'T * p', el tipo de' p - p' es 'std :: ptrdiff_t'. El Estándar C++ establece expresamente que una operación de resta de apuntador puede desbordarse, produciendo un comportamiento indefinido (C++ 11 5.7/6). –

+0

+1, cuando los punteros no cumplen estas restricciones, el comportamiento no está definido. –

Cuestiones relacionadas