Tudo bem ... primeiro eu precisava de algo que fizesse o que esta pergunta está pedindo, mas eu precisava RAPIDAMENTE! Infelizmente, a maneira "melhor" é quase 600 linhas de código !!! Perdoe o nome disso que não tem nada a ver com o que está fazendo. O nome próprio era Integer64ToCharArray (valor int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Sinta-se à vontade para tentar limpar esse código sem prejudicar o desempenho.
Entrada: qualquer valor com sinal de 64 bits do intervalo mínimo ao máximo.
Exemplo:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
Resultado:
Test: 9223372036854775807
Test: -9223372036854775808
Testes de velocidade originais: ( Integer64ToCharArray (); )
Melhor caso, valor de 1 dígito.
Loops: 100.000.000, Tempo gasto: 1.381 (Milli), Tempo por Loop 13 (Nano)
Pior caso, valor de 20 dígitos.
Loops: 100.000.000, tempo gasto: 22.656 (Milli), Tempo por loop 226 (Nano
Novos testes de velocidade de design: ( AddDynamicallyToBuffer (); )
Melhor caso, valor de 1 dígito.
Loops: 100.000.000, Tempo gasto: 427 (Milli), Tempo por Loop 4 (Nano)
Pior caso de 32 bits - valor de 11 dígitos.
Loops: 100.000.000, Tempo gasto: 1.991 (Milli), Tempo por Loop 19 (Nano)
Pior caso negativo de 1 trilhão - valor de 14 dígitos.
Loops: 100.000.000, Tempo gasto: 5.681 (Milli), Tempo por Loop 56 (Nano)
Pior caso de 64 bits - valor de 20 dígitos.
Loops: 100.000.000, Tempo gasto: 13.148 (Milli), Tempo por Loop 131 (Nano)
Como funciona!
Executamos uma técnica de divisão e conquista e, uma vez que definimos o comprimento máximo da string, simplesmente definimos cada valor de caractere individualmente. Conforme mostrado nos testes de velocidade acima, os comprimentos maiores obtêm grandes penalidades de desempenho, mas ainda é muito mais rápido do que o método de loop original e nenhum código realmente mudou entre os dois métodos, exceto o looping não está mais em uso.
Em meu uso, daí o nome, eu retorno o deslocamento e não edito um buffer de matrizes de caracteres, em vez disso, começo a atualizar os dados de vértice e a função tem um parâmetro adicional para deslocamento, portanto, não é inicializada como -1.