C++ C++;使用编译时确定的字符串文字长度值

C++ C++;使用编译时确定的字符串文字长度值,c++,performance,c++17,C++,Performance,C++17,以下做法是否合理?有没有更简单的方法来避免在运行时调用strlen(),同时将全局常量定义为const char*const?我用的是C++17 constexpr auto PREFIX = "myprefix"; std::string addPrefix(const std::string& s) { static constexpr std::string_view prefix(PREFIX); std::string buf; b

以下做法是否合理?有没有更简单的方法来避免在运行时调用strlen(),同时将全局常量定义为const char*const?我用的是C++17

constexpr auto PREFIX = "myprefix";

std::string addPrefix(const std::string& s)
{
    static constexpr std::string_view prefix(PREFIX);
    std::string buf;
    buf.reserve(s.size() + prefix.size());
    buf += prefix;
    buf += s;
    return buf;
}

是的,您的代码正在运行。您可以使用优化标志将其粘贴到编译器资源管理器中,以查看结果。
string\u视图
将在编译时完成,长度将在编译时已知,因此它不会对
strlen
进行计数

有没有更简单的方法?是的,但本质上是相同的东西,只是打包成可重用的。我有一个
append
函数(像absil这样的大型库一样),它可以接受任意数量的参数,并且只需要这样做:首先将长度相加,保留,然后复制

constexpr string\u视图
是在编译时获取长度的一种非常容易理解的方法,它通常很擅长替换原始字符,因为您可以在它上面获取所有的
字符串
类成员等,并且您不会因为尾部
\0
的分配而分心。一种更“最小”的方法不会更快(毕竟,它是在编译时完成的),而且字符串指针和长度之间有一个分隔,而不是封装它们,并且使用了一种罕见的技术,而不是一般的技术。所以,就用这个。很好

更新 正如Jarod42指出的,
PREFIX
正如您定义的,它的类型是
constchar*
。 为了澄清这一点,
“myprefix”
的类型为
const char[9]
。但是您使用的
auto
方式会退化为指针。即便如此,<代码> CONTXPRPR <代码>采用了<代码> const char */c>并对终止<代码> 0代码>代码进行扫描,因此数组的长度不起作用(您可以在数组的中间有一个NUL)。< /P> 您应该像下面这样声明常量词汇字符串文字:

constexpr char s1[] = "the letters";
因为它直接命名字符数组。如果你写:

constexpr const char* s2 = "more letters";
最后,除了实际的字符数组之外,还有另一块内存来表示指针,它的名称是
s2


您对
auto
的使用与
s2

相同这是一个基于意见的问题。你问它是否“性能合理”,但没有解释这意味着什么。你有什么理由不能使用像
constexpr auto PREFIX_SZ=sizeof(PREFIX)-1?将其更改为“合理方法”,因为实际性能是次要的。@paxdiablo这不会消除对strlen的buf+=前缀调用,是吗?是否合理取决于您的目标是什么。我们是否要从代码中推断出您的目标?(如果是这样,我们可能会得出结论,您的代码完全实现了您的目标。)
PREFIX
是一个
const char*const
,它需要
auto&
“myprefix”
是一个
const char[9]
PREFIX
是一个
conct char*const
。腐烂已经发生了。请参阅演示链接。