Czy Lua optymalizuje operatora „..”?

Muszę wykonać następujący kod:

local filename = dir .. "/" .. base

tysiące razy w pętli (jest to rekursja, która drukuje drzewo katalogów).

Zastanawiam się teraz, czy Lua łączy 3 ciągi znaków (katalog, „/”, baza) za jednym razem (tj. Przez przydzielenie łańcucha wystarczająco długo, aby pomieścić ich całkowitą długość) lub czy robi to w sposób nieefektywny, wykonując to wewnętrznie dwa kroki:

local filename = (dir .. "/")              -- step1
                               .. base     -- step2

Ten ostatni sposób byłby nieefektywny pod względem pamięci, ponieważ zamiast jednego przydzielane są dwa ciągi.

Nie obchodzą mnie cykle procesora: zależy mi głównie na zużyciu pamięci.

Na koniec pozwól mi uogólnić pytanie:

Czy Lua przydziela tylko jeden ciąg, lub 4, gdy wykonuje następujący kod?

local result = str1 .. str2 .. str3 .. str4 .. str5

BTW, wiem, że mogę to zrobić:

local filename = string.format("%s/%s", dir, base)

Ale muszę to jeszcze sprawdzić (pamięć i procesor).

(BTW, wiem o tabeli: concat (). Ma to dodatkowy narzut tworzenia tabeli, więc myślę, że nie będzie to korzystne we wszystkich przypadkach użycia.)

Pytanie dodatkowe:

Gdyby Lua nie zoptymalizował operatora „..”, czy dobrym pomysłem byłoby zdefiniowanie funkcji C do łączenia łańcuchów, np.utils.concat(dir, "/", base, ".", extension)?

questionAnswers(2)

yourAnswerToTheQuestion