我认为您最好的选择是提供一个可能处理绝大多数情况的固定缓冲区,然后对其余情况进行特殊处理。类似的东西(未经测试,除了我头骨内的湿件):
std::string GetTimeAsString (std::string formatString, time_t theTime) {
struct tm *timeinfo;
char buffer[100], *pBuff = buffer;
int rc, buffSize = 100;
timeinfo = localtime (&theTime);
rc = strftime(pBuff, 100, formatString.c_str(), timeinfo);
// Most times, we shouldn't enter this loop.
while (rc == 0) {
// Free previous in it was allocated.
if (pBuff != buffer)
delete[] pBuff;
// Try with larger buffer.
buffSize += 100;
pBuff = new char [buffSize];
rc = strftime(pBuff, buffSize, formatString.c_str(), timeinfo);
}
// Make string then free buffer if it was allocated.
std::string result(pBuff);
if (pBuff != buffer)
delete[] pBuff;
return result;
}
strftime
如果提供的缓冲区不够大,将返回零。在这种情况下,您开始分配更大的缓冲区,直到合适为止。
您的未分配缓冲区大小和用于分配大小的增量可以根据您的需要进行调整。这种方法的优点是除了极少数情况外,您不会注意到效率损失(无论它可能有多小) - 绝大多数情况下都不会进行分配。
此外,您可以选择其他一些方法(例如,+10%、加倍等)来增加缓冲区大小。