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

Reply via email to