no me gusta mucho static
miembros de datos, el problema de la inicialización de ser lo más importante.
Cada vez que tengo que hacer un procesamiento significativo, que engañar y utilizar un local de static
lugar:
class MyClass
{
public:
static const SomeOtherClass& myVariable();
};
const SomeOtherClass& MyClass::myVariable()
{
static const SomeOtherClass MyVariable(someOtherFunction());
return MyVariable;
}
De esta manera, la excepción se tiran solamente en el primer uso, y sin embargo, el objeto se const
.
Esta es una expresión bastante poderosa para retrasar la ejecución.Tenía una pequeña sobrecarga (básicamente, el compilador comprueba una bandera cada vez que entra en el método), pero es mejor preocuparse por la corrección en primer lugar;)
Si esto se llama desde varios subprocesos:
- si sus manijas del compilador que, bien
- si su compilador no lo hace, es posible que pueda utilizar el almacenamiento local de hilo (que de todos modos const)
- usted podría utilizar
boost::once
en la biblioteca Boost.Threads
- ya que es
const
, que ma Y no importa si es inicializado varias veces, a menos que someOtherFunction
no admite la ejecución en paralelo (cuidado de los recursos)
Pauta: utilice únicamente static
o global
las variables de instancias de objetos simples (que no se puede tirar), de lo contrario usar local static
variables para retrasar la ejecución hasta que pueda capturar las excepciones resultantes.
simplemente porque es const no significa que no le importe que se inicialice varias veces. Podría ser acceder a un recurso para el que realmente solo quieres dar el golpe una vez. SomeOtherFunction también podría tomar mucho tiempo para ejecutarse. En ese caso, probablemente no quieras que se ejecute antes de que main se ejecute de todos modos. – Eld
Es cierto, solo quería señalar que puede no ser necesario preocuparse por la sincronización: 'const' significa que nunca cambiará una vez inicializada, mientras que si no fuera así (piense en un contador, por ejemplo), restablecer después de que es utilizado podría arruinar las cosas. Por supuesto, le corresponde al Oficial de Operaciones sopesar los riesgos a mano ... Editaré la respuesta para aclarar este último punto. –
Estoy bastante seguro de que mi código no tiene problemas de enhebrado con esto ... debe inicializarse antes de que se inicien los hilos adicionales. Implementé esta solución y parece resolver el problema. ¡Gracias! – rmeador