selectany

Específicos de Microsoft

Indica al compilador que el elemento de datos globales declarado (variable u objeto) es un COMDAT de selección (una función empaquetada).

Sintaxis

__declspec( selectany )__declspec( selectany )

Comentarios

En tiempo de vinculación, si se ven varias definiciones de un COMDAT, el vinculador selecciona una y descarta el resto. Si se selecciona la opción del vinculador (Optimizaciones), se producirá la eliminación de COMDAT para quitar todos los elementos de datos sin referencia en la salida /OPT:REF del vinculador.

Los constructores y la asignación mediante una función global o métodos estáticos en la declaración no crean una referencia y no impedirán la eliminación de /OPT:REF. No se debe depender de los efectos secundarios de ese código si no existen otras referencias a los datos.

En el caso de los objetos globales inicializados dinámicamente, descartará también el código de inicialización de un objeto sin selectany referencia.

Un elemento de datos globales se puede inicializar normalmente solo una vez en un proyecto EXE o DLL. selectany se puede usar para inicializar datos globales definidos por encabezados, cuando el mismo encabezado aparece en más de un archivo de origen. selectany está disponible en los compiladores de C y C++.

Nota

selectany solo se puede aplicar a la inicialización real de elementos de datos globales externamente visibles.

Ejemplo: selectany atributo

Este código muestra cómo usar el selectany atributo :

//Correct - x1 is initialized and externally visible
__declspec(selectany) int x1=1;

//Incorrect - const is by default static in C++, so
//x2 is not visible externally (This is OK in C, since
//const is not by default static in C)
const __declspec(selectany) int x2 =2;

//Correct - x3 is extern const, so externally visible
extern const __declspec(selectany) int x3=3;

//Correct - x4 is extern const, so it is externally visible
extern const int x4;
const __declspec(selectany) int x4=4;

//Incorrect - __declspec(selectany) is applied to the uninitialized
//declaration of x5
extern __declspec(selectany) int x5;

// OK: dynamic initialization of global object
class X {
public:
X(int i){i++;};
int i;
};

__declspec(selectany) X x(1);

Ejemplo: Uso del selectany atributo para garantizar el plegado comdat de datos

En este código se muestra cómo usar el atributo para garantizar el plegado comdat de datos selectany cuando también se usa la opción del /OPT:ICF vinculador. Tenga en cuenta que los datos deben marcarse con selectany y colocarse en una const sección (de solo lectura). Debe especificar explícitamente la sección de solo lectura.

// selectany2.cpp
// in the following lines, const marks the variables as read only
__declspec(selectany) extern const int ix = 5;
__declspec(selectany) extern const int jx = 5;
int main() {
   int ij;
   ij = ix + jx;
}

FIN de Específicos de Microsoft

Vea también

__declspec
Palabras clave