我正在实现一个helper函数,它将按给定格式使用sprintf并以字符串形式返回。如果我先查询所需的大小,然后将分配的缓冲区传递给sprintf,我不确定是否会更慢。

wchar_t buf[MAX_PATH] = {};
swprintf(buf, MAX_PATH, format, ...);

VS
int cchBuf = swprintf(0, 0, format, ...);
unique_ptr<wchar_t[]> buf (new wchar_t[cchBuf+1]);
swprintf(buf.get(), cchBuf, format, ...);

最佳答案

因此,如果转换后的字符串不适合len字符,swprintf()将返回负值。不,它在哪里说你可以通过零并获得你想要的功能。snprintf()的reference表示了一些不同的东西,这可能就是您的想法来源。
swprintf()的这一点也相当清楚,
“swprintf()和vswprintf()使用maxlen参数,sprintf(3)和vsprintf(3)不使用。(snprintf(3)和vsnprintf(3)采用maxlen参数,但这些函数在Linux上缓冲区溢出时不返回-1。)“。
这意味着snprintf()在缓冲区溢出时不会返回-1,这意味着swprintf()会返回-1。
所以我很确定你的第二个代码片段不会按预期工作,或者至少不会是可移植的。
一个更好的方法可能是首先过度分配缓冲区,调用swprintf(),然后将缓冲区修剪到正确的长度。这将涉及大约与调用swprintf()两次相同的运行时间,并且将起作用。更好的方法是在helper函数中为swprintf()提供一个静态工作缓冲区,然后分配一个理想大小的结果缓冲区并将结果复制到其中。同样,运行时间也差不多。

10-08 11:04