2013-08-26 22 views
8

虽然掠过的草案C++ 14/C++ 1Y(n3690)我注意到引入basic_string litertal后缀在节§21.7的:basic_string文字是否在编译时更快或处理得更好?

inline namespace literals { 
inline namespace string_literals { 
    // 21.7, suffix for basic_string literals: 
    string operator "" s(const char *str, size_t len); 
    u16string operator "" s(const char16_t *str, size_t len); 
    u32string operator "" s(const char32_t *str, size_t len); 
    wstring operator "" s(const wchar_t *str, size_t len); 
} 
} 

我的问题是:

  • 使用basic_string这个文字有没有可能在运行时更快?
  • 我的“幼稚”实现是完全错误的吗?
  • ROM中的数据布局可能与文字不同,还是编译时与运行时间的差异?

背景

我知道,这使得像这样直接使用字符串文字:

std::string s1 = "A fabulous string"s; 

void sfunc(std::string arg); 

int main() { 
    sfunc("argument"s); 
} 

但究竟是什么,超过依托转换构造string(const char*)的优势在哪里?

“旧”的代码看起来:

std::string s1 = "A fabulous string"; // c'tor string(const char*) 

void sfunc(std::string arg); 

int main() { 
    sfunc("argument"); // auto-conversion via same c'tor 
} 

据我所看到的operator "" s()实施将基本上是这样的:

std::string operator "" s(const char* lit, size_t sz) { 
    return std::string(lit, sz); 
} 

所以,只要使用的相同的c'tor。我的猜测是,这必须在运行时完成,我错了吗?

编辑:作为尼科尔流星锤指出正确下面我举的例子的确使用相同的构造,而是一个具有额外长度 - 这是建筑非常有用的,很明显。这给我留下了一个问题:这对编译器来说是更好的将字符串文字放入ROM中还是编译时类似的东西?

回答

6
  • 有没有可能在运行时使用basic_string文字更快?

如前所述,字符串长度是已知的并自动传递给构造函数。

  • 我的“幼稚”实现是完全错误的吗?

不,这是正确的。

  • 在ROM中的数据的布局,则可以不同与在编译时间与运行时间的basic_string文字,或任何其它不同?

大概不会,因为相关basic_string构造不constexpr所以不会有资格静态初始化,所以可能不能放在ROM中,有在运行时间内完成。

4

所以,只是使用相同的c'tor。

OK,让我们看看如何将看:

string fromLit = "A fabulous string"s; 
string fromBare = string("A fabulous string"); 

看不到任何东西在fromBare不见了?让我拼出来给你:

string fromBare = string("A fabulous string"/*, NOTHING*/); 

呀,你不能得到字符串的长度没有 ...得到它的长度。这意味着fromBare将不得不迭代文字以找到\0字符。在运行时。 fromLit不会;编译器将字符串的长度作为编译时间确定的参数提供。任何值得使用的编译器都会将长度烧入可执行代码中。

而且即使不是的情况下,由于其他原因,它仍然更好。试想一下:

void SomeFunc(const std::string &); 
void SomeFunc(const char *); 

SomeFunc("Literal"); 
SomeFunc("Literal"s); 
SomeFunc(std::string("Literal")); 

最后两个做同样的事情(减去我之前提出的观点),但其中之一是短。即使你雇用using std::string(或愚蠢地using namespace std;),第二个仍然更短。但是很清楚究竟发生了什么。

+0

非常好的一点!具有长度是一个优势,果然。 – towi

+0

关于性能,我怀疑字符串文字会提高使用静态const:'static std :: string lit(“Literal”);';他们甚至可能会明显变慢。不得不创造一个名称并声明一个额外的变量是一种痛苦,然而,字符串文字在这些理由上是一个明显的改进。 –

1

它提供了更多的编译时安全性。

考虑How do you construct a std::string with an embedded null?

只有这样,才能构建从字面字符串包含空字符是要么指定字符串字面量(容易出错)的大小,使用initializer_list语法(详细)或做std::string某种循环与push_back(甚至更详细)的多个呼叫。但是,使用字面构造函数,大小会自动传递给您,从而消除可能的错误来源。

+0

有趣的一点,但相当罕见。包含'\ 0'的字符串文字 - 会发生,但很少。由于作者对字符串文字的控制,他只引入了一个小问题。 +1 nonethelesse,有趣的一面。 – towi

相关问题