【发布时间】:2022-06-11 06:08:16
【问题描述】:
我正在阅读这篇博文:https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times-by-70/
我不知道怎么做:
size_t len = end - str;
如果我是正确的,C 中的字符串表示为数组,而 C 字符串具有指向该数组第一个元素的指针。那么上面的行是在玩数组下标吗?
他们发布了这些行:
size_t strlen_cacher(char *str) {
static char *start;
static char *end;
size_t len;
const size_t cap = 20000;
// if we have a "cached" string and current pointer is within it
if (start && str >= start && str <= end) {
// calculate the new strlen
len = end - str;
// if we're near the end, unload self
// we don't want to mess something else up
if (len < cap / 2)
MH_DisableHook((LPVOID)strlen_addr);
// super-fast return!
return len;
}
// count the actual length
// we need at least one measurement of the large JSON
// or normal strlen for other strings
len = builtin_strlen(str);
// if it was the really long string
// save it's start and end addresses
if (len > cap) {
start = str;
end = str + len;
}
// slow, boring return
return len;
}
【问题讨论】:
-
static char* end;已经在0初始化之后被初始化,static变量被给出。所以指针算术len = end - str;是未定义的行为,因为这种算术仅在指针指向同一个对象(或一个元素之外)时才有效。 -
但指针运算以对象类型为单位工作。同样,数组索引也以对象类型为单位。因此,
len = end - str;如果end指向 nul 终止符,则len将是字符串的长度。 -
@WeatherVane
if (start ...)确保start和end在用于“快速”代码之前由“慢”代码初始化。代码不是很好,我同意。 -
@user3386109 是的,我注意到了,但乍一看...
-
代码中不包含声称的size_t len = char* str - char* end,减法反之。