On Apr 9, 10:13 am, Gianni Mariani <gi3nos...@mariani.ws> wrote:
> Siddhartha Gandhi wrote:
> > On Apr 8, 8:14 pm, "bark" <ander...@gmail.com> wrote:
>
> >>On Apr 6, 8:39 pm, Gianni Mariani <gi3nos...@mariani.ws> wrote:
>
> >>>I just thought of yet another way - this one will create a default
> >>>constructed orzeroinitialized POD object depending on what type of
> >>>pointer you're trying to assign it to.
>
> >>>struct InitObj
> >>>{
> >>> template <typename T>
> >>> operator T * ()
> >>> {
> >>> return new T();
> >>> }
>
> >>>};
>
> >>>// usage - template automagically figures out which type to new
> >>>PMYSTRUCT * mys = InitObj();
>
> >>>int * z = InitObj();
>
> >>>Note the lack of amemsetcall and note that the code will work for POD
> >>> types as well as non POD types.
>
> >>If in the class there is a C-character array, how does one initialize
> >>such an array to 0's?
>
> >>tia
> >>Anders.
>
> > In the constructor, use memset()?
>
> That's the point, the code above does not need to use memset.
>
> i.e.
> struct A { int a; char b[333]; };
>
> A * foo() { return new A(); } // note the () after the A
>
> The A object created above is guarenteed to be initialized by the C++
> standard.
>
> GCC creates the following code:
>
> .globl _Z3foov
> .type _Z3foov, @function
> _Z3foov:
> .LFB2:
> pushl %ebp
> .LCFI0:
> movl %esp, %ebp
> .LCFI1:
> pushl %ebx
> .LCFI2:
> subl $16, %esp
> .LCFI3:
> pushl $340
> .LCFI4:
> call _Znwj
> movl %eax, %ebx
> addl $12, %esp
> pushl $340
> pushl $0
> pushl %eax
> call memset
> movl %ebx, %eax
> movl -4(%ebp), %ebx
> leave
> ret
>
> Note the call to memset by the compiler.
>
> The code below is just a simplification to make it easier to use...
>
> struct NewInitializedObject
> {
> // conversion operator does automagic detection
> // of which type to create.
> template <typename T>
> operator T * ()
> {
> return new T();
> }
>
> };
>
> // usage
> PMYSTRUCT * mys = NewInitializedObject();
>
> mys points to a new MYSTRUCT correctly initialized.
thanks, i'll try this out.
br/anders
|