[OT] Can global variable be passed into Python function?
Dave Angel
davea at davea.name
Sun Mar 2 14:17:41 EST 2014
Chris Angelico <rosuav at gmail.com> Wrote in message:
> On Mon, Mar 3, 2014 at 12:22 AM, Dave Angel <davea at davea.name> wrote:
>> Sure, for some definition of "usable". Overhead such as block
>> size, freelist pointer etc., are obviously outside of the
>> returned block. But the array size that's specified in a call to
>> new [], and the vptr, are definitely inside the malloc'ed block,
>> and may be before the struct data.
>
> Hmm. Last I was working with it, the array size to new[] was outside
> the block, just as the block size to malloc(). The vptr is part of any
> struct/class with virtual functions, and effectively acts as a hidden
> class member, so you get one of those inside the block, and it's
> included in sizeof.
>
> //Allocated Space: The Final Frontier!
> #include <stdio.h> //cout sucks :)
>
> class Foo
> {
> int x;
> int y;
> int z;
> };
>
> class Bar
> {
> int x;
> int y;
> int z;
> virtual int get_x() {return x;}
> };
>
> int main()
> {
> printf("sizeof(int) = %u\n",sizeof(int));
> printf("sizeof(int*) = %u\n",sizeof(int*));
> printf("sizeof(Foo) = %u\n",sizeof(Foo));
> printf("sizeof(Bar) = %u\n",sizeof(Bar));
> Foo *foo = new Foo[10];
> printf("foo = %p/%p = %u\n",foo,foo+10,(char *)(foo+10)-(char *)foo);
> Bar *bar = new Bar[10];
> printf("bar = %p/%p = %u\n",bar,bar+10,(char *)(bar+10)-(char *)bar);
> return 0;
> }
>
>
> rosuav at sikorsky:~$ g++ frontier.cpp && ./a.out
> sizeof(int) = 4
> sizeof(int*) = 8
> sizeof(Foo) = 12
> sizeof(Bar) = 24
> foo = 0xf38010/0xf38088 = 120
> bar = 0xf38090/0xf38180 = 240
>
>
>
> The rules of structs are that they be contiguous, that they be laid
> out sequentially, and that any padding needed between structures is at
> the end of the previous one (which is why three of 4 bytes makes 12
> bytes, but three of 4 bytes plus 8 bytes makes 24 - the eight-byte
> pointer has to be aligned on a multiple of eight bytes, so having a
> 20-byte structure that starts with an 8-byte pointer is a no-no). The
> allocated block of memory is, by definition, the same as the pointer
> to its first element. As it happens, the pointer bar is not synonymous
> with &bar->x, &bar->y, or &bar->z, which means the vptr is at the
> beginning of bar, which makes sense; but the compiler's not obliged to
> do that, and in some cases may choose not to - for instance, if bar
> (with a virtual function) inherited from foo (with none), it might be
> convenient to allow a pointer-cast to not change the value of the
> pointer. (g++ 4.7.2 still puts the vptr at the beginning of bar in
> that case, but other compilers or other versions may differ.)
>
> Array size is outside the block, presumably before it, as &foo[0] is
> by definition identical to foo, and there's no room inside the
> structure for any spare data. Virtual function table is inside the
> block because it's a hidden member of the object (like __class__ in
> Python, only better hidden).
>
Array size is inside the malloc block, but outside the struct
block. As you can see if you try to delete without the brackets
when you used new [], some runtimes will crash.
This is not to say that there will always be these extra offsets,
just that they can be there.
--
DaveA
More information about the Python-list
mailing list