百科狗-知识改变命运!
--

C++里面的struct与C里面的struct有何不同?

泡在奶味里1年前 (2023-12-14)阅读数 6#综合百科
文章标签分配数组

c++中的struct可以有成员函数(方法),但是c不能有,例如下面的结构体:

#include

struct

sample

{

int

a,b,c;

void

set(int

x,int

y,int

z){a=x;b=y;c=z;}

char*tostr(){char

p[20]={0};sprintf(p,"%d

%d

%d",a,b,c);return

p;}

};

调用:

struct

sample

q;

q.set(100,132,152);

C++里面的struct与C里面的struct有何不同?

printf("%s\n",q.tostr());

结果为:100

132

152

在c++中可以编译通过并运行正常,但是在c中不能!

c中,应该换成:

#include

struct

sample

{

int

a,b,c;

};

void

set(struct

sample

&

todo,int

x,int

y,int

z)

{

todo.a=x;

todo.b=y;

todo.c=z;

}

char*tostr(struct

sample

todo)

{

char

p[20]={0};

sprintf(p,"%d

%d

%d",todo.a,todo.b,todo.c);

return

p;

}

调用方法:

struct

sample

q;

set(q,13,12,0);

printf("%s\n",tostr(q));

结果为:13

12

0

明白了吧~

类(class)和结构体(struct)的异同:struct的实例 所占内存大小是固定的,class实例 所占内存大小是不固定的(因为可以继承);当然,从另一个角度解读就是class是可继承的,而struct是不可以继承的;这是一个硬币的两面;这是它们在存储上的区别,你可以把struct当作阉割后的class。

· struct 默认 是传值,但可以传引用,class则默认传引用,无法传值。这是它们在使用上的区别。

下面展开说几点:

(1)class也可能分配在栈上(特例)

Int32[] cache = new Int32[100];

cache一个数组,是class,使用 new 关键字,它是分配在堆上的。

Int32* cache = stackalloc Int32[100];

当使用 stackalloc 它就是分配在栈上了。

值类型数组是特例,但这一特例就够了,表明class是可以分配在栈上的。一般的class是无法分配在栈上的,编辑器解释说无法知道size。当然,你也可以认为数组是一个特殊的类型,这个特例不算。实际上,这里的数组已经丢失了class的特征了,你再也无法用数组类去引用它了。如果去除这个特例,则class无法在栈上分配。但是,你也可以这样理解——不是不能,而是不为,微软目前还不想这样干。因为虽然class的size是不确定的,但一个class的实例存在一个最小size,只分配这个最小size的内存即可——C++就这样干的。微软不支持,可能他们认为这样没必要,不必要搞这么复杂。一般来说,能够stackalloc 值类型数组就足够了。

(2)struct也可以分配在堆上

这个无须解释。任何class里面的struct都是分配在堆上的(通过stackalloc分配的数组除外)。有没办法直接分配呢?我试了几分钟,没发现把struct直接分配在托管堆上的方法,但却可以通过Marshal.AllocHGlobal方法分配在非托管堆上。因此,有两种方法可以struct分配在堆上:

(a)设struct是某个class的成员,可将struct分配在托管堆上

(b)使用Marshal或自己写的内存分配器,可将struct分配在非托管堆上

(3)struct也可以传引用

struct默认是传值的,在安全环境下,使用ref关键字可以传引用,在非安全环境下,使用指针可以传引用。

(4)引入struct是为了解决性能问题——小粒度对象的传值比传引用效率高。同时,在非安全代码中,可以使用struct以及指针和非托管资源交互。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)