如果我在头文件中有一个字符串变量,它将在不同的文件和翻译单元中使用,我应该将它存储在constexpr const char* 还是const std::string中?
下面是一个例子:
// config.h
constexpr const char* string_a = "stringA"; // <--should i declare it like this?
const std::string string_b = "stringB"; // <--or like this?
// a.h
#include "config.h"
class A{
public:
A();
};
// a.cpp
#include "a.h"
A::A(){
cout << string_a << endl;
}
// b.h
#include "config.h"
class B{
public:
B();
};
// b.cpp
#include "b.h"
B::B(){
cout << string_b << endl;
}
// main.cpp
#include "a.h"
#include "b.h"
int main(){
A a;
B b;
cout << string_a << endl;
cout << string_b << endl;
return 0;
}
我从书上读到建议总是使用string而不是char*,但我也听说constexpr是在编译时初始化的,这很好。
3条答案
按热度按时间0s7z1bwu1#
任何时候你考虑在速度和可读性/可维护性,分析代码以确定是否看到不可忽略的速度提高是至关重要的。
对于您的情况,constexpr不太可能提供显著的速度提升。显著的缺点是,你将不得不在const char* 中管理内存,并且你将无法访问std::string的方便功能。
yws3nbqq2#
这取决于用法,例如,如果你想在某些功能中使用const char* 作为std::string,那么它将产生从const char* 创建std::string的开销。但我仍然会远离const char*,并使用std::string_view,您可以constexpr,但能够转换为const char* 或std::string,反之亦然。只要注意构造std::string_view的对象的生存期。这里不是问题,因为它的全球性。
g52tjvyc3#
如果不了解具体情况,这个问题就没有明确的答案。
在许多情况下,选择哪一个并不影响结果,因此您应该选择适合您正在使用的代码库(即考虑代码的清晰度,让编译器去考虑优化)。
如果您需要应用
std::string
类提供的函数,那么创建std::string
可能是一个好主意。另一方面,如果您正在为资源有限的环境编码,例如对于具有少量RAM和存储在非易失性存储器中的程序的嵌入式应用,编译器能够在编译时构造它可能是重要的。您必须进行实验,但这肯定会在
const char *
上工作,但在std::string
上就不那么肯定了(尽管编译器一直在变得更好,所以这可能会改变)。编译器是否能够在编译时构造变量也会影响在头文件中定义字符串是否是一个好主意。这是它自己的问题,参见Define constant variables in C++ header。
最后,如果您需要从不是用C++编写的代码模块中访问字符串,则
const char *
将是首选的。一个普通的C模块。