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