从PHP的strftime实现想到的

28 Feb 2014

缘由

在开发过程中, 利用strftime函数对含有类似%Y%m%d的字符串模板进行格式化的过程中, 发现字符串过长(超过1024)时, 后返回空字符串. 回头查查PHP手册, 发现也有一句话提到了这一限制. 为什么呢?

源码分析

PHP strftime本质上是对time.hstrftime的封装:

看一下代码实现:

// ...
int                  max_reallocs = 5;
size_t               buf_len = 256, real_len;
// ...
buf = (char *) emalloc(buf_len);
while ((real_len=strftime(buf, buf_len, format, &ta))==buf_len || real_len==0) {
    buf_len *= 2;
    buf = (char *) erealloc(buf, buf_len);
    if (!--max_reallocs) {
        break;
    }
}
// ...

可以看到, 初始返回内存大小为256字节, 对于绝大部分的strftime的应用场景是足够了. 同时作者考虑到了buf不够的情形, 尝试做了倍增的内存分配策略. 但是超过最大重新分配次数4后, 放弃了内存倍增的重试策略, 这就导致当字符串长度超过1024(=4*256)时, 就直接返回空串. 实现代码里面没有看到对于这种策略的解释.

想法

HOME