offsetof函数及结构体传参

举报
芒果_Mango 发表于 2022/03/28 10:21:22 2022/03/28
1.3k+ 0 0
【摘要】 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-计算成员相对起始位置的偏移量

image-20220310222523788


例如:

image-20220310222536463

#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个字节

image-20220310222606287


而如果使用Print2函数,只开辟4/8字节的空间

image-20220310222648702


结论:结构体传参的时候,要传结构体的地址


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。