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