selectany

Блок, относящийся только к системам Майкрософт

Сообщает компилятору, что объявленный элемент глобальных данных (переменная или объект) является универсальным COMDAT (упакованной функцией).

Синтаксис

__declspec( selectany )declarator

Замечания

Во время компоновки, если отображается несколько определений COMDAT, компоновщик выбирает один из них и игнорирует остальные. Если выбран параметр /OPT:REF компоновщика (оптимизация), то исключение COMDAT приведет к удалению всех элементов данных без ссылок в выходных данных компоновщика.

Конструкторы и назначение с помощью глобальной функции или статических методов в объявлении не создадут ссылку и не предотвратят исключение /OPT:REF. Побочные эффекты такого кода не должны быть зависимыми, если не существует других ссылок на данные.

Для динамически инициализируемых глобальных объектов также selectany не будет карта код инициализации неуправляемого объекта.

Обычно элемент глобальных данных можно инициализировать только один раз в проекте EXE или DLL. selectany можно использовать при инициализации глобальных данных, определенных заголовками, если один и тот же заголовок отображается в нескольких исходных файлах. selectany доступен как в компиляторах C, так и в C++.

Примечание.

selectany можно применить только к фактической инициализации глобальных элементов данных, которые являются видимыми внешне.

Пример: selectany атрибут

В этом коде показано, как использовать 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);

Пример. Использование selectany атрибута для обеспечения свертывания данных COMDAT

В этом коде показано, как использовать selectany атрибут для обеспечения свертывания данных COMDAT при использовании /OPT:ICF параметра компоновщика. Обратите внимание, что данные должны быть помечены и selectany помещены в const раздел (readonly). Раздел, доступный только для чтения, необходимо указать явно.

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

Завершение блока, относящегося только к системам Майкрософт

См. также

__declspec
Ключевые слова