我对预处理器宏几乎没有疑问。以下是两个不同的代码片段的例子;
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;
}
所以我的问题是;
感谢。
答案 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?