selectany

Specyficzne dla firmy Microsoft

Informuje kompilator, że zadeklarowany globalny element danych (zmienna lub obiekt) jest wybraną funkcją COMDAT (spakowana).

Składnia

__declspec( selectany )Declarator

Uwagi

Jeśli jest widocznych wiele definicji MODELU COMDAT, konsolidator wybiera jeden i odrzuca resztę. Jeśli zostanie wybrana opcja /OPT:REF konsolidatora (Optymalizacje), eliminacja MODELU COMDAT zostanie usunięta, aby usunąć wszystkie niereferencjonowane elementy danych w danych wyjściowych konsolidatora.

Konstruktory i przydziały według funkcji globalnej lub metod statycznych w deklaracji nie tworzą odwołania i nie uniemożliwiają eliminacji /OPT:REF. Skutki uboczne takiego kodu nie powinny być zależne od tego, kiedy nie istnieją żadne inne odwołania do danych.

W przypadku dynamicznie zainicjowanych obiektów globalnych selectany również odrzuci kod inicjowania obiektu bez wnioskowania.

Globalny element danych można zwykle zainicjować tylko raz w projekcie EXE lub DLL. selectany można użyć w inicjowaniu danych globalnych zdefiniowanych przez nagłówki, gdy ten sam nagłówek pojawia się w więcej niż jednym pliku źródłowym. selectany jest dostępny zarówno w kompilatorach C, jak i C++.

Uwaga

selectany można zastosować tylko do rzeczywistej inicjowania globalnych elementów danych, które są widoczne zewnętrznie.

Przykład: selectany atrybut

Ten kod pokazuje, jak używać atrybutu 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);

Przykład: Użyj selectany atrybutu, aby zapewnić składanie danych COMDAT

Ten kod pokazuje, jak używać atrybutu selectany w celu zapewnienia składania danych COMDAT podczas korzystania z opcji konsolidatora /OPT:ICF . Należy pamiętać, że dane muszą być oznaczone i selectany umieszczone w const sekcji (readonly). Musisz jawnie określić sekcję tylko do odczytu.

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

END Microsoft Specific

Zobacz też

__declspec
Słowa kluczowe