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;
}
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по