如何解决如何在 MSVC 中将动态初始化的全局变量标记为“未使用时可丢弃”?
我有一些像
这样的全局变量FARPROC const f = GetProcAddress(...);
如果确定代码在链接时未使用(例如 /Gy
和 /OPT:REF
),是否有任何方法可以促使编译器或链接器丢弃它们(以及相关的初始化代码)?
解决方法
我想通了。似乎 __declspec(selectany)
做到了这一点,即使没有通过 /Gw
。
举个例子,这个程序将只包含GetTickCount_
:
#include <Windows.h>
FARPROC GetTickCount_ =
GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"GetTickCount");
__declspec(selectany) FARPROC GetTickCount64_ =
GetProcAddress(GetModuleHandle(TEXT("Kernel32.dll")),"GetTickCount64");
int main()
{
}
,
对于跨平台解决方案,请在模板类中使用 static
变量。如果未使用,即使初始化器有副作用,它们也会被丢弃。
示例:
#include <cstddef>
#include <iostream>
template <std::nullptr_t = nullptr>
struct A
{
inline static const int value = []{
std::ios_base::Init init;
std::cout << "Hello,world!\n";
return 42;
}();
};
int main()
{
// Nothing is printed,unless you uncomment following:
// (void)A<>::value;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。