使用mem alloc通过指针或指针指向函数发送字符串数组?

问题描述 投票:1回答:2

这两个函数都填充了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);
}
c function pointers pass-by-reference
2个回答
3
投票

将指针传递给指针的可能性要比将指针传递给TCHAR要高得多。两种替代方案(性能方面)之间唯一显着的区别是,B执行一个额外的地址 - (&)和一个解除引用(一元*)操作,虽然这使得原则上B的成本更高,但区别在于不太可能引人注意。

当然,编译器可以将两个调用优化为完全相同的代码。它甚至可以优化掉calloc()电话,尽管不太可能。

总的来说,不太可能值得花时间专注于这种微优化,除非您可能已经通过测量确定包含它们的代码部分太慢,并且您无法找到算法改进,并且您有理由相信,您尝试优化的特定操作会对代码的成本做出重大贡献。


0
投票

FunctionA略微提高效率,因为它的解除引用效果较差。

© www.soinside.com 2019 - 2024. All rights reserved.