It's not a bug, but just two ways to write the same thing: in Vala-style or in C-style. 21.06.2011 22:18 пользователь "Serge Hulne" <[email protected]> написал: > Apparently > > string a = "hello"; > string * b = a; > > and : > > string a = "hello"; > unowned string b = a; > > appear to be translated by Vala into the exact same C code. > > Are these two ways to declare the same thing or is this just a bug which > happens to work perchance ? > > Serge. > > > > On Tue, Jun 21, 2011 at 8:02 PM, Serge Hulne <[email protected]> wrote: > >> Erratum: >> ======= >> >> As Alexandre Rosenfeld correctly pointed out, the easy (and correct) >> way to get a reference on a Vala string is simply to declare it as >> follows: >> >> string a = "hello"; >> string * b = a; >> >> As illustrated in the following snippet: >> >> /// >> void main (string[] argv) { >> >> string a = "hello"; >> string * b = a; >> >> stdout.printf("Value of a = %s\n", a); >> stdout.printf("Value of b = %s\n", b); >> } >> /// >> >> Which yields : >> >> Value of a = hello >> Value of b = hello >> >> the corresponding C code generated by Vala being: >> >> >> ///---------------- >> /* test_ref.c generated by valac 0.12.1, the Vala compiler >> * generated from test_ref.vala, do not modify */ >> >> >> #include <glib.h> >> #include <glib-object.h> >> #include <stdlib.h> >> #include <string.h> >> #include <stdio.h> >> >> #define _g_free0(var) (var = (g_free (var), NULL)) >> >> >> >> void _vala_main (gchar** argv, int argv_length1); >> >> >> void _vala_main (gchar** argv, int argv_length1) { >> gchar* _tmp0_; >> gchar* a; >> const gchar* b; >> _tmp0_ = g_strdup ("hello"); >> a = _tmp0_; >> b = a; >> fprintf (stdout, "Value of a = %s\n", a); >> fprintf (stdout, "Value of b = %s\n", b); >> _g_free0 (a); >> } >> >> >> int main (int argc, char ** argv) { >> g_type_init (); >> _vala_main (argv, argc); >> return 0; >> } >> ///--------- >> >> In which there is indeed no duplication of memory allocation. >> >> as can be seen from: >> _tmp0_ = g_strdup ("hello"); >> a = _tmp0_; >> b = a; >> >> >> Serge. >> >> >> On Tue, Jun 21, 2011 at 9:05 AM, Serge Hulne <[email protected]> >> wrote: >> > Suggestion: >> > ========= >> > A class wrapper for the string type in Vala, in order to avoid >> > duplication of data in assignments (which would yield an unnecessarily >> > huge memory usage when processing a large amount of text with a lot of >> > assignments). >> > >> > if you compare the C code generated by Vala for: >> > >> > 1) >> > >> > /// >> > class String { >> > public string s; >> > } >> > >> > void main (string[] argv) { >> > String a = new String(); >> > a.s = "hello"; >> > String b = a; >> > stdout.printf("a.s = %s\n", a.s); >> > stdout.printf("b.s = %s\n", b.s); >> > } >> > /// >> > >> > >> > To : >> > >> > 2) the C code generated by Vala for: >> > >> > /// >> > void main (string[] argv) { >> > string a = "hello"; >> > string b = a; >> > stdout.printf("a = %p\n", &a); >> > stdout.printf("b = %p\n", &b); >> > } >> > /// >> > >> > You will notice that in the second case (the naive straightforward >> > formulation) the data is duplicated (passed by value in the >> > assignment) whereas in the first case (which uses a class wrapper) the >> > object a is assigned to b by reference (not by value, i.e. the data is >> > not duplicated) >> > >> > >> > Serge. >> > >>
_______________________________________________ vala-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/vala-list
