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

Reply via email to