使用宏定义与const变量

时间:2018-04-16 09:36:37

标签: c++ variables const preprocessor

我对预处理器宏几乎没有疑问。以下是两个不同的代码片段的例子;

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; 
}

所以我的问题是;

  • 第一个版本是否会增加二进制文件大小(比较第一个版本)?
  • 第二个版本是否消耗更多内存(比较第一个版本)?
  • 两种实施的性能影响是什么?哪个应该运行得更快,为什么?
  • 在哪种条件下哪个是优选的/有益的?
  • 有没有更好的方法来实现设置默认值?

感谢。

2 个答案:

答案 0 :(得分:3)

  

第一个版本是否会增加二进制文件大小(比较第一个版本)?

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

  

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

没有。它以几乎相同的方式与内存一起工作。

  

两种实施的性能影响是什么?哪个应该运行得更快,为什么?

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

然而,与性能一样,只需测量它 - 它应该很容易,因为您已经实现了两个版本的代码。

  

在哪种情况下哪个是优选的/有益的?

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

  

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

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

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

答案 1 :(得分:2)

两者都很可怕,第二部分比第一部略差。

最好的方法是使用

constexpr char DEFAULT_STRING[] = "default_value";

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