Отправить массив строк в функцию с помощью указателя или указателя на указатель с помощью mem alloc? - PullRequest
1 голос
/ 22 марта 2019

Обе эти функции заполняют 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);
}

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Маловероятно, что передать указатель на указатель будет дороже, чем передать указатель на TCHAR. Единственное существенное различие между вашими двумя альтернативами с точки зрения производительности состоит в том, что B выполняет одну дополнительную операцию адресации (&) и одну разыменование (унарное *), и хотя это делает B чуть-чуть более дорогостоящим в принципе , разница вряд ли будет заметна.

Конечно, компилятор может оптимизировать два вызова для одного и того же кода. Это может даже оптимизировать вызовы calloc(), хотя это менее вероятно.

В целом, вряд ли стоит тратить свое время на микрооптимизацию такого рода, если, возможно, вы не определили с помощью измерений, что фрагмент кода, содержащий их, слишком медленный, и вы не можете найти алгоритмическое улучшение, и у вас есть основания полагать, что конкретные операции, которые вы пытаетесь оптимизировать, вносят существенный вклад в стоимость этого кода.

0 голосов
/ 22 марта 2019

FunctionA означает немного более эффективно, потому что делает меньше разыменования.

...