C++:返回C字符串的最快方法

Pau*_*ern 5 c c++ performance

我有一个简单的函数,它接受一个字符串并返回一个字符串,在C中它看起来像;

char* get_string(char c) {
  switch(c) {
    case 'A': return "some string";
    Case 'B': return "some other string";
...
Run Code Online (Sandbox Code Playgroud)

并且它工作正常,但后来我希望我的代码在C++中工作,而C++编译器会抛出一个gamillions"从字符串常量转换为'char*'".我理解这个警告,但我不能100%确定实现该功能的最佳方法是什么,因此它可以快速地在C和C++上工作.这个函数被大量调用,它是一个重要的瓶颈,所以它必须很快.我最好的尝试是;

char* get_string(char c) {
  char* str = (char*)malloc(50);
  switch(c) {
    case 'A':
      sprintf(str, "some string");
      return str;
    Case 'B':
      sprintf(str, "some other string");
      return str;
...
Run Code Online (Sandbox Code Playgroud)

In *_*ico 19

返回a const char*而不是char*.该const在这方面的意思是"这个指针指向一个常量指针对象" -换句话说,调用者不能修改返回的字符串.这允许编译器将字符串放在某个内存位置,这样get_string()函数就可以只返回那些字符串的地址.如果调用者需要修改返回的字符串,他们可以分配自己的缓冲区并复制它(最好是通过std::string).

const char* get_string(char c) { 
  switch(c) { 
    case 'A': return "some string"; 
    case 'B': return "some other string"; 
...
Run Code Online (Sandbox Code Playgroud)


Tyl*_*nry 6

如果您返回一个常量字符串(在本例中就是),则您的返回值应该是const char*. 如果需要返回可变字符串,通常有以下三种方法:

强制调用者预先分配字符串

int get_string (char c, char* outstr, size_t outstr_len) 
{
   // Write the output into outstr using strcpy or similar
   // and return an error code if outstr_len is smaller than
   // the space required to store the string
}
Run Code Online (Sandbox Code Playgroud)

这是 C 语言中最惯用的做法,但需要调用者做最多的工作。

代表调用者分配字符串

char* get_string (char c) 
{ 
   char* str = malloc(/* however big */);
   // ...
   return str;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此方法相对较慢,您需要记录调用者有责任释放返回的字符串,并且应该使用free(而不是delete[])来释放它。您可以在此处使用new[]anddelete[]代替mallocand free,但我假设您这样做的唯一原因是与 C 代码进行互操作。

分配静态缓冲区

char* get_string (char c) 
{ 
   static char* str[/* however big */];
   // ...
   return str;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您必须记录保证返回的字符串有多大,并且调用者不会释放它。这里的主要缺点是后续调用get_string将破坏之前返回的字符串。

Ed:嗯,markdown 似乎不喜欢混合代码和列表