selectany

Sezione specifica Microsoft

Viene indicato al compilatore che l'elemento dati globale (variabile o oggetto) è una funzione inclusa nel pacchetto (COMDAT) a scelta.

Sintassi

__declspec( selectany )declarator

Osservazioni:

In fase di collegamento, se sono visualizzate più definizioni di COMDAT, il linker ne sceglie una e ignora il resto. Se l'opzione /OPT:REF del linker (Ottimizzazioni) è selezionata, l'eliminazione COMDAT si verificherà per rimuovere tutti gli elementi di dati non referenziati nell'output del linker.

I costruttori e l'assegnazione attraverso funzione globale o metodi statici presenti nella dichiarazione non creano un riferimento e non impediscono l'eliminazione di /opt:REF. Non si dovrebbe contare sugli effetti collaterali di tale codice, quando non esistono altri riferimenti ai dati.

Per gli oggetti globali inizializzati in modo dinamico, selectany eliminerà anche il codice di inizializzazione di un oggetto senza riferimenti.

In genere, un elemento dati globale può essere inizializzato solo una volta, in un progetto DLL o EXE. selectany può essere usato per inizializzare i dati globali definiti dalle intestazioni, quando la stessa intestazione viene visualizzata in più file di origine. selectany è disponibile sia nei compilatori C che in C++.

Nota

selectany può essere applicato solo all'inizializzazione effettiva degli elementi di dati globali visibili esternamente.

Esempio: selectany attributo

Questo codice illustra come usare l'attributo selectany :

//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);

Esempio: usare l'attributo selectany per garantire la riduzione dei dati COMDAT

Questo codice illustra come usare l'attributo selectany per garantire la riduzione dei dati COMDAT quando si usa anche l'opzione /OPT:ICF del linker. Si noti che i dati devono essere contrassegnati con selectany e inseriti in una const sezione (sola lettura). È necessario specificare esplicitamente la sezione di sola lettura.

// 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;
}

Fine sezione specifica Microsoft

Vedi anche

__declspec
Parole chiave