2011-09-25 10 views
10

Estaba revisando EASTL's list class para ver cómo el autor implementó los nodos. Mi expectativa era una clase/estructura simplista. En cambio, veo una base y un nodo que hereda de esta base (aún simplista, pero ¿por qué dos clases?). Sus comentarios se explican por qué:¿Un tipo de plantilla desperdicia espacio en C++?

Definimos una ListNodeBase por separado de NodoLista (abajo), ya que nos permite que tienen operaciones no moldeados tales como insertar, eliminar (abajo), y lo hace de manera que la el nodo de lista de anclaje no lleva una T con él, que sería desperdicio de espacio y posiblemente llevaría a sorprender al usuario debido a las Ts adicionales existentes que el usuario no creó explícitamente. La desventaja de todo esto es que hace que la visualización de depuración de una lista sea más difícil, dado que los punteros de nodo son de tipo ListNodeBase y no ListNode. Sin embargo, vea ListNodeBaseProxy a continuación.

No entiendo un par de cosas aquí. I do entiendo la parte sobre por qué hará que la depuración sea un poco más difícil, pero ¿qué quiere decir con list anchor node doesn't carry a T with it y would waste space and possibly lead to surprising the user due to extra Ts existing that the user didn't explicitly create?

Respuesta

7

Sin la clase auxiliar, el nodo raíz de la lista contendría una instancia de T que nunca se utiliza. La segunda oración dice que es posible que no espere que una lista vacía cree una T. Por ejemplo, crear una T podría tener efectos secundarios.

1

Me parece que la idea es separar la abstracción de la lista de los datos que contiene. Solo necesita el ListNode cuando realmente desea acceder a los datos, todo lo demás se puede hacer en el resumen ListNodeBase. Así es como entiendo el list anchor node doesn't carry a T with it.

Hay algo sobre el espacio. Las clases de plantilla se crean por tipo, por lo que si tiene varios tipos diferentes utilizados para T, sin el ListNodeBase estaría creando copias en plantilla de todas las operaciones por tipo, con eso - usted no, y el LinkNode las hereda, y solo requiere la memoria para los datos reales. Parece que el espacio guardado se refiere al tamaño real del código en este caso.

+0

No utiliza una lista sin datos. Hay un único nodo llamado ** nodo de anclaje ** o ** centinela ** que está presente en cada instancia de la lista, incluso en la lista vacía, para eliminar algún código de caso especial asociado con listas vacías. Es este nodo único que no necesita contener los datos del usuario. –

+0

@ n.m. esa sería la 'lista' de clases, puede echar un vistazo a la implementación en el enlace publicado por OP. Dado que la 'lista' en sí es el centinela, el punto es discutible. – littleadv

+0

He buscado. Por lo que puedo decir, la 'list' * contiene * the sentinel, en la línea' base_node_type mNode; '. –

1

Realmente quiere apoyar listas vacías. Si el nodo principal siempre contiene una T y cada lista contiene un nodo principal, se deduce que cada lista contiene al menos una T y, por lo tanto, nunca puede estar vacía.

Cuestiones relacionadas