C ++可执行文件大小根据宏定义而增加

时间:2014-12-28 08:11:49

标签: c++11 macros

所以我有以下课程:

#define SINGLETON Singleton::GetInstance()

//#define MY_MACRO(X) Singleton::RunS(X) 
//#define MY_MACRO(X) SINGLETON->Run(X)

class Singleton;
using Singleton_ptr = std::shared_ptr < Singleton > ;

class Singleton
{
public:

    static Singleton_ptr GetInstance();
    static wstring  RunS(__in const wstring& strSource) { return SINGLETON->Run(strSource); }

public:

    void Run(__in const wstring& strSource);

private:

    static Singleton_ptr ms_Instance;
    Singleton();
};

您可以看到我有两种不同的方式来定义MY_MACRO

  1. #define MY_MACRO(X) Singleton::RunS(X)。 AKA - def1
  2. #define MY_MACRO(X) SINGLETON->Run(X)。 AKA - def2
  3. MY_MACRO宏在我的整个解决方案中使用了~2000次。

    我定义MY_MACRO的方式似乎对我的可执行文件大小有重大影响。 def2 生成更大的可执行文件(增加120KB),然后 def1

    问题

    1. 任何人都可以解释为什么宏定义中的这种简单差异会改变可重复的大小吗?
    2. 是否有最佳方法来定义MY_MACRO以最小化可执行文件的大小?

1 个答案:

答案 0 :(得分:2)

使用def2宏定义,编译器将添加代码以在每个宏调用站点创建和销毁std::shared_ptr < Singleton >。使用def1时,std::shared_ptr < Singleton >仅在Singleton::RunS()功能代码中创建/销毁。

我有点怀疑这会影响整个尺寸差异,所以我怀疑代码数量增加可能还有其他原因。例如,如果您正在使用GCC进行编译并包含符号,则调试信息将包含在可执行文件中,def2中的其他函数调用可能会考虑添加到二进制文件中的其他调试信息。