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
