【问题标题】:VisualStudio *.obj files size (513Mb objs and 534Mb lib)VisualStudio *.obj 文件大小(513Mb objs 和 534Mb lib)
【发布时间】:2009-01-06 09:39:03
【问题描述】:

我是一名 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) 已关闭。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    例子

    假设你在一个头文件中有这个。

    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* );
    

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

    【讨论】:

    • “使用显式实例化仅在一个地方生成所需的实例化”是什么意思?
    猜你喜欢
    • 2014-07-21
    • 2013-08-09
    • 2010-11-24
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多