2012-04-17 15 views
7

¿Hay alguna forma de garantizar el orden de inicialización del objeto estático para ciertos objetos para todo el programa? Tengo asignadores de memoria que me gustaría que se asignan como las primeras cosas en un programa, ya que se utilizarán en otro lugar en todo el programa y quiero utilizar estos asignadores para asignar toda la memoria posterior.Inicialización de memoria específica del compilador

Entiendo que esto es probablemente un compilador específico ya que no creo que el estándar de C++ lo permita. Los dos compiladores que me interesan para hacer esto son los compiladores de gcc y VS2010. Si hay una manera, ¿podría alguien explicar cómo?

EDITAR

no quiero "construir en el primer uso" debido a que los asignadores serán asignando un gran bloque de memoria que yo quiero inicializado al comienzo del programa.

+1

¿Quiere decir "asegurar el orden de inicialización del objeto estático" o qué? – Griwes

+1

¿Por qué alguien votó negativamente? – chadb

+5

Es posible que desee volver a escribir su pregunta. Porque no tiene mucho sentido la forma en que está – Grizzly

Respuesta

7

Puede afectar algo el orden de inicialización mediante el uso de directivas específicas del compilador. MSVC tiene un pragma

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]}) 

que de alguna manera puede establecer la prioridad para un módulo específico. Consulte esta referencia para init_seg.

El compilador gcc tiene una sintaxis de atributo similar/relacionada para establecer la prioridad relativa de una inicialización específica. Parece que este

Some_Class A __attribute__ ((init_priority (2000))); 
Some_Class B __attribute__ ((init_priority (543))); 

y se explica en esta página en init_priority.

+1

Muy interesante. ¿Podría proporcionar un ejemplo de cómo hacer Some_Class para MSVC? – josephthomas

+1

@Bo Persson: ¿Sería capaz de mostrar un ejemplo de Some_Class para MSVC? Después de leer la documentación, no veo cómo es posible algo similar a Some_Class A (aunque sí creo que es posible, es lo que dice la documentación, sin embargo, parece que no puedo lograrlo). – chadb

+0

No puede obtener exactamente la misma funcionalidad para MSVC. Puede agregar '#pragma init_seg (lib)' al archivo que inicializa un objeto de 'Some_Class' para que se inicialice antes del código de usuario. No puede obtener una prioridad exacta para cada objeto individual. –

0

Supongo que se está refiriendo al fiasco de orden de inicialización estática, mediante el cual su programa tiene la posibilidad de invocar un comportamiento indefinido cuando una variable estática se inicializa en función del estado de otra variable estática (que puede o no) ha tenido su constructor llamado en ese momento).

La solución a este problema es la construcción en el primer uso idioma, descrito en el FAQ de C++ aquí:

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

+0

Analicé esto anteriormente, sin embargo, no quiero "construir en el primer uso" porque los asignadores asignarán un gran bloque de memoria que quiero inicializar al inicio del programa. – chadb

+1

@chadb: Tal vez deberías describir con más detalle lo que estás haciendo. Debido a su pregunta, supongo que la construcción en el primer uso está perfectamente bien (tenga en cuenta que el primer uso puede ser dentro de la construcción de un objeto estático). – Grizzly

+0

Por lo tanto, el primer inicializador activará la asignación de memoria para intentar usarla. – ams

0

En lugar de tratar de controlar la inicialización estática, que sólo le hará horas o más del tiempo ridículo de depuración en el futuro, asigne su grupo de memoria al inicio de main. Entonces todavía obtienes tu memoria preasignada sin todas las trampas de init estático.

+0

Es un poco tarde para todos los inicializadores estáticos que se ejecutan antes de main y dependen de la memoria en cuestión. – ams

+0

arco de harvard. los procesadores pueden necesitar la inicialización estática para almacenar datos en la memoria del programa, generalmente solo leen la memoria flash en AVR uC. como una memoria de solo lectura que no se puede asignar o inicializar en tiempo de ejecución. –

Cuestiones relacionadas