这两个函数均填充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);
}
根据我的以下评论,这是FunctionC:
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);
}
答案 0 :(得分:3)
将指针传递给指针比将指针传递给TCHAR
的代价几乎是不可能的。从性能角度来看,这两种选择之间唯一的显着区别是B执行了一个额外的地址操作(&
)和一个取消引用操作(一元*
),尽管这使B有点原则上讲,成本更高,差异不太明显。
当然,编译器可以优化两个调用以完全相同的代码。它甚至可以优化calloc()
调用,尽管这种可能性较小。
总的来说,不太可能值得您花时间来进行此类微优化,除非您通过测量确定包含它们的代码部分过慢,并且找不到< em> algorithmic 的改进,并且您有理由相信您要优化的特定操作会对该代码的成本做出重大贡献。
答案 1 :(得分:0)
FunctionA
稍微,效率更高,因为其取消引用的次数较少。