offsetof函数及结构体传参
【摘要】 offsetof-计算成员相对起始位置的偏移量例如:#include<stddef.h>struct S1{ char c1; int i; char c2;};int main(){ printf("%u\n",offsetof(struct S1,c1));//0 printf("%u\n",offsetof(struct S1,i));//4 pr...
offsetof-计算成员相对起始位置的偏移量
例如:
#include<stddef.h>
struct S1
{
char c1;
int i;
char c2;
};
int main()
{
printf("%u\n",offsetof(struct S1,c1));//0
printf("%u\n",offsetof(struct S1,i));//4
printf("%u\n",offsetof(struct S1,c2));//8
return 0;
}
注意:offsetof是一个宏,第一个参数是结构体类型!!!,第二个参数是成员名
结构体传参
struct S
{
int data[100];
int num;
};
//结构体传参:传值
void Print1(struct S s)
{
printf("%d\n",s.num);
}
void Print2(struct S* ps)
{
printf("%d\n",ps->num);
}
int main()
{
struct S s = {{1,2,3,4},1000};
Print1(s);
Print2(&s);
return 0;
}
更偏向于使用Print2函数
函数传参的时候,参数需要压栈,会议时间和空间上的系统开销。
如果传递一个结构体对象(传值),结构体过大时,参数压栈的系统开销比较大,会导致性能下降
而传地址(指针),只占4/8字节
如上面的Print1函数,int data[1000],int num 在不考虑内存对齐情况下,都占用了4004个字节
而如果使用Print2函数,只开辟4/8字节的空间
结论:结构体传参的时候,要传结构体的地址
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)