pilas pila nodos listas lista invertir estatica enlazada ejemplos dinamica con codigo arreglos c++ memory-management scope c++11 software-design

c++ - nodos - pila estatica en c codigo



¿Cómo elijo la asignación de pila frente a la asignación de pila en C++? (2)

Una de las características de C ++ que lo diferencia de otros idiomas

... es que hay que hacer la asignación de memoria manualmente. Pero dejemos eso a un lado:

  • asignar en el montón cuando un objeto tiene que ser de larga duración, es decir, debe sobrevivir un cierto alcance, y es caro o imposible de copiar o mover,
  • asigne en el montón cuando un objeto es grande (donde grande puede significar varios kilobytes si quiere estar en el lado seguro) para evitar el desbordamiento de la pila, incluso si el objeto solo es necesario temporalmente
  • asigne en el montón si está usando el lenguaje pimpl (firewall del compilador) ,
  • asignar matrices de tamaño variable en el montón,
  • asignar en la pila de lo contrario porque es mucho más conveniente.

Tenga en cuenta que en la segunda regla, por "objeto grande" me refiero a algo como

char buffer[1024 * 1024]; // 1MB buffer

pero no

std::vector<char> buffer(1024 * 1024);

ya que el segundo es en realidad un objeto muy pequeño que envuelve un puntero a un búfer asignado en el montón.

En cuanto a punteros vs. miembros de valor:

  • use un puntero si necesita asignación de pila,
  • Usa un puntero si estás compartiendo la estructura,
  • usar un puntero o referencia para el polimorfismo,
  • use una referencia si obtiene un objeto del código del cliente y el cliente se compromete a mantenerlo vivo,
  • Use un valor en la mayoría de los otros casos.

El uso de punteros inteligentes, por supuesto, se recomienda cuando sea apropiado. Tenga en cuenta que puede usar una referencia en caso de asignación de almacenamiento dinámico porque siempre puede delete &ref , pero no recomendaría hacerlo. Las referencias son punteros disfrazados con una sola diferencia (una referencia no puede ser nula), pero también indican una intención diferente.

Una de las características de C ++ que lo distingue de otros idiomas es la capacidad de asignar objetos complejos como variables miembro o variables locales en lugar de tener que asignarlos siempre con new . Pero esto lleva a la pregunta de cuál elegir en cualquier situación dada.

¿Hay algún buen conjunto de criterios para elegir cómo asignar las variables? ¿Cuándo debo declarar una variable miembro como una variable recta en lugar de como una referencia o un puntero? ¿Cuándo debo asignar una variable con una new lugar de usar una variable local que está asignada en la pila?


Hay poco que añadir a la respuesta de larsmans.

La asignación en la pila generalmente simplifica la administración de recursos, no tiene que preocuparse por las pérdidas de memoria o la propiedad, etc. Una biblioteca GUI se basa en esta observación, verifique "Todo pertenece a algún lugar" y "Quién posee los widgets".

Si asigna todos los miembros en la pila, por lo general basta con el ctor de copia por defecto y op = por defecto. Si asigna los miembros en el montón, debe tener cuidado al implementarlos.

Si asigna la variable miembro en la pila, la definición del miembro debe estar visible. Si lo asigna en el montón, entonces puede reenviar declarar ese miembro. Personalmente me gustan las declaraciones a futuro, reduce la dependencia.