这两个函数都填充了TCHAR sStringA和sStringB。问题是哪一个更适合并且更有效地返回结果?
#include <tchar.h>
#include <Windows.h>
void FunctionA(TCHAR *sString1, DWORD dwLen)
{
_tcscpy_s(sString1, dwLen, L"String1");
return;
}
void FunctionB(TCHAR **sString2, DWORD dwLen)
{
*sString2 = (TCHAR*)calloc(dwLen, sizeof(TCHAR));
_tcscpy_s(*sString2, dwLen, L"String2");
return;
}
int main()
{
TCHAR *sStringA = (TCHAR*)calloc(100, sizeof(TCHAR));
TCHAR *sStringB = NULL;
FunctionA(sStringA, 100);
FunctionB(&sStringB, 100);
free(sStringA);
free(sStringB);
}
从下面的评论中,这里是功能:
void FunctionC(TCHAR **sString2, DWORD dwLenOut)
{
TCHAR sString[] = L"String2";
dwLenOut = (DWORD) _tcslen(sString) + 1;
*sString2 = (TCHAR*)calloc(dwLenOut, sizeof(TCHAR));
_tcscpy_s(*sString2, dwLenOut, sString);
return;
}
int main()
{
TCHAR *sStringC = NULL;
DWORD dwLen = 0;
FunctionC(&sStringC, dwLen);
}
将指针传递给指针的可能性要比将指针传递给TCHAR
要高得多。两种替代方案(性能方面)之间唯一显着的区别是,B执行一个额外的地址 - (&
)和一个解除引用(一元*
)操作,虽然这使得原则上B的成本更高,但区别在于不太可能引人注意。
当然,编译器可以将两个调用优化为完全相同的代码。它甚至可以优化掉calloc()
电话,尽管不太可能。
总的来说,不太可能值得花时间专注于这种微优化,除非您可能已经通过测量确定包含它们的代码部分太慢,并且您无法找到算法改进,并且您有理由相信,您尝试优化的特定操作会对代码的成本做出重大贡献。
FunctionA
略微提高效率,因为它的解除引用效果较差。