2010-01-20 16 views
18

Chciałbym wiedzieć, jaki jest najbardziej efektywny i praktyczny sposób wysyłania Qstring jako parametru do funkcji, w szczególności w QT. Chcę użyć odniesienia. Problemem jest również chcę instancję ten ciąg w samej funkcji jak tak na przykład:Jaki jest najlepszy sposób na wysłanie QStrings w wywołaniu funkcji?

jest to prototyp funkcji:

void myFunction(QString & theMsg); 

jest to wywołanie funkcji:

myFunction(tr("Hello StringWorld")); 

teraz function tr() zwraca QString, ale nie działa z referencją (rozumiem dlaczego).

muszę to zrobić:

QString theQstr("Hello StringWorld"); 
myFunction(theQstr); 

Czy istnieje prostszy sposób to zrobić, jednocześnie korzystając referencje lub może po prostu zmienić parametr funkcji do korzystania z QString i to jeszcze być skuteczny?

+0

Co powiesz na to: myFunction (QString ("Hello StringWorld")); – Jamol

+0

To wygenerowało komunikat kompilacji. Myślę, że tak jest, ponieważ generuje to jedynie wartość zwrotu, bez konkretnej informacji. –

+0

Ten link może pomóc: [Right_way_to_pass_QString_to_methods] (http://developer.nokia.com/community/wiki/Right_way_to_pass_QString_to_methods) – ABCplus

Odpowiedz

14

QString wykorzystuje krów (copy on write) za kulisy, więc rzeczywisty ciąg nie jest kopiowane, nawet jeśli używać podpisu takiego:

void myFunction (QString theMsg)

(dopóki nie zmodyfikujesz).

Jeśli bezwzględnie potrzebujesz referencji, użyłbym const &, chyba że masz zamiar zmodyfikować argument wejściowy.

void myFunction (QString const & theMsg)

+0

Nie, to świetnie, thx! to właśnie chciałem wiedzieć. Tak naprawdę robi to samo, co NSString w Objective-C na Macu. –

+13

Jeśli spojrzysz na kod źródłowy Qt, zobaczysz, że Qt ma tendencję do przekazywania typów Qt jako const T i do funkcji. Mimo że używają COW, kopiowanie klasy jest nieco większe niż tylko przekazywanie referencji. – Colin

+0

@Colin Czy możesz rozwinąć ten koszt? Po prostu spojrzałem na źródło, a QString to tylko otoki wokół wskaźnika. I sizeof() ed 'QString' i' const QString & ', aby się upewnić, i oba miały 4 bajty. Ponieważ QString jest w zasadzie samym wskaźnikiem (a refs są efektywnymi wskaźnikami), dlaczego bardziej efektywnym byłoby przekazanie wskaźnika do wskaźnika zamiast samego wskaźnika? Wygląda na to, że const-ref byłby nieco mniej wydajny ... – weberc2

7

Najbardziej wydajny i praktyczny sposób używa const odniesienia. QString COW będzie wolniejszy niż przekazywanie przez odniesienie, ale szybszy niż zwykła kopia.

+1

Dlaczego? [więcej znaków, aby komentarz był ważny] – weberc2

Powiązane problemy