C 简单对象系统
我正在努力学习《艰难之路》一书,在练习19中遇到了一些问题。作者说ex19是为了让学习者了解c语言中的宏。我在理解这个概念上没有问题,但我只是不理解其他的一切。我无法理解对象原型是如何创建的 特别是,下面这句话是什么意思 由于C将Room.proto字段放在第一位,这意味着el指针是 真的只有指向足够的内存块才能看到完整的 对象结构。它甚至不知道它叫proto 相关代码如下:C 简单对象系统,c,malloc,calloc,C,Malloc,Calloc,我正在努力学习《艰难之路》一书,在练习19中遇到了一些问题。作者说ex19是为了让学习者了解c语言中的宏。我在理解这个概念上没有问题,但我只是不理解其他的一切。我无法理解对象原型是如何创建的 特别是,下面这句话是什么意思 由于C将Room.proto字段放在第一位,这意味着el指针是 真的只有指向足够的内存块才能看到完整的 对象结构。它甚至不知道它叫proto 相关代码如下: // this seems weird, but we can make a struct of one size, /
// this seems weird, but we can make a struct of one size,
// then point a different pointer at it to "cast" it
Object *el = calloc(1, size);
*el = proto;
Room*arena=NEW之后(Room,“竞技场,有牛头怪”)代码>,你可以直接做这个竞技场->坏家伙=新(怪物,“邪恶的牛头怪”)电脑怎么知道有个坏家伙
Object*el=calloc(1,size);
和*el=proto;
)之后,*el的内容究竟是什么指向练习的链接:它所做的只是分配
1*大小的字节。malloc/calloc没有什么神奇之处。他通过新宏将sizeof(T)传递给函数,并将其放入Object_NEW的size参数中。因此,函数只知道以字节为单位的大小。calloc
还有一个附加功能,即它用零字节填充分配的内存,而如果最初需要全部或部分分配为零,则使用等效的malloc
调用将需要额外的步骤
在代码中
arena->bad_guy = NEW(Monster, "The evil minotaur");
编译器知道结构的布局,因为访问是通过arena变量进行的,arena变量被声明为指向Room的指针,Room可能是结构的typedef
另一方面,结构中的顺序保证允许在复合结构或扩展结构中进行有限形式的继承
struct A {
int x;
};
struct B {
int foo;
double baloney;
};
struct B
(或指向它的指针)可以强制转换为(指向a的指针)struct a
,因为它们都以int
开头。当然,如果您以另一种方式强制转换,struct A
必须最初是struct B
,否则对baloney
字段的访问权限将未定义。换句话说,struct B
基本上以struct a
开始
如果我像这样重写我的示例,这可能更容易理解:
struct A {
int x;
};
struct B {
struct A foo;
double baloney;
};
现在,您可以通过不同的方式从结构B中获取结构a
struct A a;
struct B b;
a = b.foo; // regular member variable access
struct A *ap = &a;
struct B *bp = &b;
ap = (struct A *)bp; // cast the pointer
ap = & b.foo; // take a pointer from the member variable
ap = & bp->foo; // take a pointer from the member variable via a pointer
内存“malloc”ed的类型由分配返回值的指针类型暗示。malloc的大小由“malloc”例程存储在某个地方(通常在返回地址之前的内存中)。这就是“free”神奇地知道调用它时返回多少内存的方式。谢谢!我懂一点。。。但我只想知道什么是
Object*el=calloc(1,size)代码>指的是正常的操作方式是Object*el=calloc(1,sizeof(Object))代码>,以及执行此操作后内存中发生了什么*el=proto代码>由于el指向的大于proto需要的值。由于calloc
用零字节填充内存,内存中的结果将是proto的值后跟零字节,直到大小。在我的示例中,struct A
是struct B
的一个适当子集,因此struct B
始终可以像使用struct A
一样使用。它们包含相同的前缀,即int
。基本上,struct B
在开头包含一个struct a
,即使成员变量有不同的名称。多亏了快速回答!我想我明白了,真的谢谢!