c++ - VisualStudio *.obj 文件大小(513Mb objs 和 534Mb lib)

标签 c++ visual-studio visual-studio-2008

我是一名 C++ 开发人员,使用的是 Visual Studio 2008。 如何减小 *.obj 文件的大小? 我读过 why are my visual studio .obj files are massive in size compared to the output .exe?但没有找到答案。

当我将项目构建为静态库时,所有 *.obj 文件的总大小为 513Mb,生成的库为 534Mb。 每个 obj 文件为 1-13Mb。 调试 exe 文件为 11Mb。 链接时代码生成 (/Gm) 已关闭。

提前致谢。

最佳答案

由于将大量重复代码和符号放入多个目标文件中,目标文件往往会变大。这通常是由内联函数和实例化模板代码的拷贝引起的。

生成的可执行文件比所有目标文件的总和小得多,因为可以丢弃重复的弱符号和未引用的符号。

就个人而言,我不会担心目标文件的大小,但如果您想减少它,请尽量减少内联函数的使用,并考虑将模板代码与其他代码放在不同的文件中,并使用显式实例化来生成所需的实例化只在一个地方。

例子

假设您在头文件中有这个。

template< class T >
inline void F( T* t )
{
    // ... some code
}

如果您将 F 用于少数类型,那么每个翻译单元都会为其使用的类型生成该函数的拷贝。

如果您只用声明替换它:

template< class T > void F( T* t );

然后您可以在单独的源文件中只生成您需要的实例:

template< class T > void F( T* t )
{
    // definition
}

template void F< int >( int* );
template void F< char >( char* );
template void F< MyType >( MyType* );

当然,您现在必须手动管理哪些类型需要模板实例化。

关于c++ - VisualStudio *.obj 文件大小(513Mb objs 和 534Mb lib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/415941/

相关文章:

c# - 将 MSBuild 生成的文件添加到 Visual Studio 解决方案资源管理器

.net - Visual Studio 设计器表单中 ToolStrip 的自定义 ToolStripButton

c++ - 如何让两个函数相互调用 C++

c++ - OpenCV 中的 Python C++ 绑定(bind)

c# - 不使用 Windows 窗体 (C#) 创建远程桌面客户端应用程序

c++ - 为什么在 Visual Studio 中用 C++ 编写 GUI 应用程序的代码与控制台应用程序不同?

c# - 如何在构建后事件中集成条件逻辑

c++ - 我可以解决 "rebuilding"加载调试器吗?

c++ - 我可以重新定义一个 C++ 宏然后再定义它吗?

c++ - 如何从 QtQuickWidget 加载 qt Quick ui 表单?