Las ideas de redondeo son realmente relevantes, pero indirectamente. La pregunta es "qué optimizaciones están destinadas a permitirse". Eso es hacer algunas suposiciones sobre el proceso de estandarización wrt. optimizaciones. En general, la intención es permitir todas las optimizaciones no observables y algunas más, como la elisión de copia, donde la no llamada del copiador sea observable. En este caso, capacity() != size()
podría ser un efecto observable de una optimización, y el estándar lo permite.
En cuanto a las razones para agregar esta latitud, también podría imaginar ignorar una solicitud de contracción cuando capacity()
es solo el 101% de size()
- ganancias muy pequeñas. Nunca habrá una sola razón precisa, ya que el LWG está formado por muchas personas con muchos puntos de vista. Simplemente existe (hubo) un consenso suficiente de que hay suficientes oportunidades de optimización adicionales creadas al otorgar esta libertad.
Podría imaginar que algún asignador podría querer asignar en bloques de longitudes fijas. Por lo tanto, si el tamaño del elemento es menor que el tamaño del bloque, aún puede sobreasignar. Solo un poco de adivinación ... –
@Johannes: Si publicaste eso como respuesta, sería mucho más fácil de aclarar. Vea mi comentario para doblar abajo, además no veo cómo un asignador puede comunicar eso al vector (allocate() solo devuelve un puntero), pero supongo que podría ser parcialmente especializado si se usa std :: allocator. Aunque eso me hace preguntarme sobre las especializaciones de los usuarios (aún permitidas, ¿verdad?) Y los conflictos. –