【问题标题】:C++ Executable sizes increases depending on a macro definitionC++ 可执行文件大小根据宏定义而增加
【发布时间】:2014-12-28 08:11:48
【问题描述】:

所以我有以下课程:

#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)。又名 - def1
  2. #define MY_MACRO(X) SINGLETON-&gt;Run(X)。又名 - def2

MY_MACRO 宏在我的整个解决方案中使用了大约 2000 次。

看来我定义MY_MACRO 的方式对我的可执行文件大小有重大影响。 def2 生成比 def1 大得多的可执行文件(增加 120KB)。

问题

  1. 谁能解释为什么宏定义中的这种简单差异会改变可原谅的大小?
  2. 是否有定义MY_MACRO 以最小化可执行文件大小的最佳方法?

【问题讨论】:

  • 60 字节/出现?这并不多。这是一个优化的构建吗?
  • 是的。优化代码以最小化大小。无论哪种方式,在这两种情况下编译代码都是相同的。唯一的区别是宏定义。

标签: c++11 macros


【解决方案1】:

使用您的def2 宏定义,编译器将添加代码以在每个宏调用站点创建和销毁std::shared_ptr &lt; Singleton &gt;。对于def1std::shared_ptr &lt; Singleton &gt; 仅在Singleton::RunS() 功能代码中创建/销毁。

我有点怀疑这会导致整个大小差异,所以我怀疑代码量增加可能还有其他原因。例如,如果您使用 GCC 进行编译并包含符号,则调试信息包含在可执行文件中,def2 中的附加函数调用可能会导致一些附加调试信息被添加到二进制文件中。

【讨论】:

  • 这是一个很好的解释。关于这是否会解释整个大小差异,我用def1 编译一次,然后用def2 编译一次,看到大小差异。
猜你喜欢
  • 2014-09-26
  • 2016-06-17
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多