我必须创建一个非常便宜的算法(处理器和内存)来char
从 C 中的字符串(char 数组)中删除第一个。
我目前正在使用:
char *newvalue = strdup(value+1);
free(value);
value = newvalue;
但我想知道是否有更便宜的方法可以做到这一点。字符串value
是动态分配的。
我必须创建一个非常便宜的算法(处理器和内存)来char
从 C 中的字符串(char 数组)中删除第一个。
我目前正在使用:
char *newvalue = strdup(value+1);
free(value);
value = newvalue;
但我想知道是否有更便宜的方法可以做到这一点。字符串value
是动态分配的。
value+1
是一个char*
表示删除第一个字符的字符串。这是获得这样一个字符串的更便宜的方法..
释放内存时必须小心,但要确保释放原始指针而不是移位的指针。
重用原始数组。可能会或可能不会更快,取决于内存(取消)分配和复制的相对速度。
int size = strlen(value);
if (size > 0) memmove(value, value+1, size);
由于堆调用将非常昂贵,因此明显的优化是避免它们。
如果您需要经常这样做,您可能会想出一些简单的包装器来围绕可以表达这一点的裸指针。
就像是:
typedef struct {
const char *chars;
size_t offset;
} mystring;
然后,您需要设计一个 API mystring *
,通过添加偏移量将 a 转换为字符指针:
const char * mystring_get(const mystring *ms)
{
return ms->chars + ms->offset;
}
当然还有一个创建删除第一个字符的后缀的函数:
mystring mystring_tail(const mystring *ms)
{
const mystring suffix = { ms->chars, ms->offset + 1};
return suffix;
}
请注意,按 valuemystring_tail()
返回新的字符串结构,以避免堆分配。