【问题标题】:Using macro definition vs const variable [duplicate]使用宏定义与 const 变量
【发布时间】:2018-09-26 00:02:40
【问题描述】:

我对预处理器宏有一些疑问。这里有 2 个不同的代码片段的例子来讨论;

tmp.h
#define DEFAULT_STRING "default_value"

tmp.cpp
void tmpFunc(std::string newValue){
    m_stringValue = newValue;
    if(newValue.isEmpty())
        newValue = DEFAULT_STRING; 
}

还有第二个版本

tmp.h
const std::string m_defaultValue = "default_value"

tmp.cpp
void tmpFunc(std::string newValue){
    m_stringValue = newValue;
    if(newValue.isEmpty())
        newValue = m_defaultValue; 
}

所以我的问题是;

  • 第一个版本是否增加了二进制大小(与第一个版本相比)?
  • 第二个版本是否消耗更多内存(与第一个相比)?
  • 这两种实现对性能有何影响?哪个应该跑得更快,为什么?
  • 在哪种情况下哪个更可取/有益?
  • 有没有更好的方法来实现设置默认值?

谢谢。

【问题讨论】:

标签: c++ variables constants preprocessor


【解决方案1】:

第一个版本是否增加了二进制大小(与第一个相比)?

没有。由于字符串只使用一次,因此在编译文件中只会出现一次。

第二个版本是否消耗更多内存(与第一个相比)?

没有。它以几乎相同的方式处理内存。

这两种实现对性能有何影响?哪个应该跑得更快,为什么?

两种实现都复制字符串:该方法按值接收newValue,复制它。我猜这种复制会主导性能。

但是,与往常一样,只需测量性能即可 - 这应该很容易,因为您已经实现了两个版本的代码。

在哪种情况下哪个更可取/有益?

宏不是 C++ 中的惯用解决方案。使用const 字符串。

有没有更好的方法来实现设置默认值?

通过引用接收新字符串。除此之外,没有那么多。我假设这里的默认值是一个短字符串,例如"none""default"。这些字符串有short string optimization,所以你如何存储它并不重要。

与性能一样,如果您发现您的方法是性能瓶颈,请对其进行优化。不知道就不要优化了。

【讨论】:

  • 我经常使用引用,但是通过引用传递原始类型有什么显着差异吗?
【解决方案2】:

两者都很糟糕,第二个比第一个略好。

最好的方法是使用

constexpr char DEFAULT_STRING[] = "default_value";

有关constexpr 的更多信息,请参阅When should you use constexpr capability in C++11?

【讨论】:

  • 能否请您详细说明为什么它更好?
  • 那为什么不是constexpr std::string呢?
  • @YSC,你的编译器会吐出来的。在 C++17 中添加了string_view 以提供帮助。
  • @YSC 因为std::basic_string 没有 constexpr 构造函数。在想法上 constexpr std::string_view foo("abc"); 应该可以工作,但是......大多数编译器还没有。所以目前 char 数组很好。
  • 是的。那么可能是std::string_view。到那时,我开始同意你使用char[]
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2015-08-03
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多