Format stringa - czy optymalnie

0

Cześć, potrzebuję własną klasę stringa. A skoro już ją robię, to chcę ją zaopatrzyć w metodę typu format. Ma to być format w stylu printf. Założenia są takie, że ma być optymalnie, zgodnie z zasadami i bez zewnętrznych bibliotek. Niestety Microsoft wyciął mi kilka możliwości, pisząc że różne metody (np. sprintf) są przestarzałe i nie powinno się ich używać. Odnoszą się jednak do StringCchVPrintfExW

Więc skonstruowałem sobie coś takiego, tylko chciałbym prosić, żebyście rzucili okiem i stwierdzili, czy jest ok, optymalnie i tak dalej, czy można lepiej:

String String::format(const wchar_t * str, ...)
{
	va_list args;
	va_start(args, str);

	wchar_t * pBuff = NULL;
	size_t remain;
	size_t i = 0, len = 0;

	do
	{
		if(pBuff)
		{
			delete [] pBuff;
			pBuff = NULL;
		}
		len = MAX_PATH * ++i;
		pBuff = new wchar_t[len + 1];
		
	}while(StringCchVPrintfExW(pBuff, len, NULL, &remain, 0, str, args) != S_OK);

	va_end(args);

	String ret;
	if(pBuff)
	{
		ret = pBuff;
		delete [] pBuff;
	}
	
	return ret;
}

Działanie jest następujące:
W pętli tworzę sobie tablicę znaków o wielkości MAX_PATH.
Następnie wywołuję funkcję formatującą. Jeśli bufor okazał się za mały, to robię kolejną iterację: niszczę utworzoną wcześniej tablicę i tworzę nową - 2 razy większą. W końcu bufor jest odpowiednio duży, więc na jego podstawie tworzę stringa i go zwracam. Co o tym myślicie?

0

A tak właściwie to w jakim celu to robisz?

0

Potrzebuję stringa do większego systemu. Nie mogę używać std::wstring, bo system będzie robiony na różnych visualach.

0

OK, przypominam, że jednym z założeń jest brak zewnętrznych bibliotek ;) A czemu mój kod nie jest wydajny? Jak można go poprawić?

1

Zanim zaczniesz cokolwiek optymalizować musisz odpowiedzieć sobie na zajebiście ale to zajebiście ważne pytanie - co to znaczy wydajny? Wydajny względem czego i na jakich testach? Czy twój kod na pewno leży w hot spocie aplikacji? A co jeśli wąskim gardłem wcale nie będzie formatowanie stringa ale I/O które wykonasz chwilę później żeby go wypisać na konsoli? Bez benchmarków nie ma sensu rozmawiać o wydajności.

Żeby nie było że nie jestem merytoryczny:) - jak już znajdziesz odpowiedzi na zajebiście ważne pytania zastanów się (i koniecznie zmierz!) na ile twój kod spełnia 3 ogólne cechy wydajnego kodu na współczesnych komputerach opartych o architekturę x86/x64 (w kolejności od najważniejszego):

  1. Cache-friendly.
  2. Allocation-free,
  3. Copy-free.
    Te 3 wytyczne to IMO dobry punkt startowy profilowania jakiegokolwiek kodu w jakimkolwiek języku programowania na jakimkolwiek OS-ie.
0

Już się nastawiłem na ten cppformat, ale jakoś nie potrafię tego użyć. Wkładam do projektu format.h i format.cc, ale dostaję błędy linkera:
error LNK2019: unresolved external symbol "public: void __thiscall fmt::BasicFormatter<char>::format(class fmt::BasicCStringRef<char>)" (?format@?$BasicFormatter@D@fmt@@QAEXV?$BasicCStringRef@D@2@@Z) referenced in function "public: void __thiscall fmt::BasicWriter<char>::write(class fmt::BasicCStringRef<char>,class fmt::ArgList)" (?write@?$BasicWriter@D@fmt@@QAEXV?$BasicCStringRef@D@2@VArgList@2@@Z)

1 użytkowników online, w tym zalogowanych: 0, gości: 1