gpt4 book ai didi

c++ - 如何防止 VC++ 9 链接器链接不必要的全局变量?

转载 作者:太空狗 更新时间:2023-10-29 22:53:26 26 4
gpt4 key购买 nike

我正在玩 function-level linking在 VC++ 中。我启用了 /OPT:REF and /OPT:ICF链接器很乐意删除所有未使用的函数。变量不是这样。

以下代码仅用于演示问题,我完全理解实际以这种方式构建代码是次优的。

//A.cpp
SomeType variable1;

//B.cpp
extern SomeType variable1;
SomeType variable2;
class ClassInB {
//actually uses variable1
};

//C.cpp
extern SomeType variable2;
class ClassInC {
//actually uses variable2;
};

所有这些文件都被编译成一个静态库。消费者项目仅使用 ClassInC 并链接到静态库。现在是 VC++ 9 链接器。

首先,链接器看到 C.obj 引用 variable2 并包含 B.objB.obj 引用 variable1,因此它包含 A.obj。然后未引用的东西消除阶段开始。它删除 A.objB.obj 中的所有函数,但不删除变量。 variablevariable2 都与它们的静态初始化器和反初始化器一起保存。这会增大图像大小并引入运行初始化程序和取消初始化程序的延迟。

上面的代码过于简单,在实际代码中我真的不能轻易地将variable2移动到C.cpp中。我可以将它放入一个单独的 .cpp 文件中,但这看起来真的很愚蠢。是否有更好的选择来解决 Visual C++ 9 的问题?

最佳答案

MSDN (参见 Arguments 部分,REF | NOREF arguments,第 4 段)指定 您必须明确地将数据标记为 COMDAT;使用 __declspec(selectany). 链接器在使用 /OPT:REF 时删除所述未使用的数据。

您是否尝试过并有机会使用__declspec(selectany)? ?

关于c++ - 如何防止 VC++ 9 链接器链接不必要的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com