selectany
Specyficzne dla firmy Microsoft
Informuje kompilator, że zadeklarowany element danych globalnych (zmienna lub obiekt) pozwala pobrać dowolny COMDAT (funkcja opakowana).
__declspec( selectany ) declarator
Uwagi
W czasie łączenia, jeśli jest widocznych wiele definicji COMDAT, konsolidator wybiera jedną i odrzuca resztę.Jeśli opcja konsolidatora /OPT:REF (optymalizacje) jest zaznaczona, to nastąpi eliminacja COMDAT w celu usunięcia wszystkich elementów danych bez odwołań w danych wyjściowych konsolidatora.
Konstruktory i przypisania przez globalną funkcję lub metody statyczne w deklaracji nie tworzą odwołania i nie zapobiegają eliminacji /OPT:REF.Efekty uboczne takiego kodu nie powinny zależeć od tego czy istnieją inne odwołania do danych.
Dla dynamicznie zainicjowanych obiektów globalnych, selectany również spowoduje odrzucenie kodu inicjującego obiekt bez odwołania.
Globalny element danych zwykle może być zainicjowany tylko raz w projekcie EXE lub DLL.selectany można użyć podczas inicjowania 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 w kompilatorach C i C++.
[!UWAGA]
selectany można stosować tylko do rzeczywistego inicjowania elementów danych globalnych widocznych zewnętrznie.
Przykład
W kodzie tym pokazano sposób użycia 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);
W kodzie tym pokazano sposób użycia atrybutu selectany do zapewnienia składania COMDAT danych, gdy używana jest także opcja konsolidatora /OPT:ICF.Należy zauważyć, że dane muszą być oznaczone selectany i umieszczone w sekcji const (tylko do odczytu).Należy 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;
}
KONIEC informacji specyficznych dla firmy Microsoft