【自定义类型引领视觉盛宴】(中)

简介: 【自定义类型引领视觉盛宴】

【自定义类型引领视觉盛宴】(上):https://developer.aliyun.com/article/1424800


再来练习一个


#include<stdio.h>
#include<stddef.h>
struct S1
{
  int i;
  char c1;
  char c2;
};
int main()
{
  //offsetof可以计算结构体成员相较于结构体起始位置的偏移量
  printf("%d\n", offsetof(struct S1, i));
  printf("%d\n", offsetof(struct S1, c1));
  printf("%d\n", offsetof(struct S1, c2));
  return 0;
}


代码图解:



验证:



结构体嵌套问题的字节大小求解


#include<stdio.h>
//练习3-结构体嵌套问题
struct S3
{
  double d;
  char c;
  int i;
};
struct S4
{
  char c1;
  struct S3 s3;
  double d;
};
int main()
{
  printf("%d\n", sizeof(struct S4));
  return 0;
}


代码图解:



验证:



为什么存在内存对齐?


1. 平台原因(移植原因):

       不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

2. 性能原因:

       数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。


总体来说: 结构体的内存对齐是拿空间来换取时间的做法。


那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到: 让占用空间小的成员尽量集中在一起。


//例如:
struct S1
{
  char c1;
  int i;
  char c2;
};//12字节
struct S2
{
  char c1;
  char c2;
  int i;
};//8字节


S1和S2类型的成员一模一样,但是S1和S2所占空间的大小有了一些区别。


1.7 修改默认对齐数


之前我们见过了 #pragma 这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数。


#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
#pragma pack(1)//设置默认对齐数为1
struct S2
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
int main()
{
    //输出的结果是什么?
    printf("%d\n", sizeof(struct S1));
    printf("%d\n", sizeof(struct S2));
    return 0;
}


运行结果:



1.8 结构体传参


#include <stdio.h>
struct S
{
  int data[1000];
  int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{
  printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
    //printf("%d\n", (*ps).num);
  printf("%d\n", ps->num);
}
int main()
{
  print1(s);  //传结构体
  print2(&s); //传地址
  return 0;
}


上面的 print1 和 print2 函数哪个好些?


       print2更好,因为函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。


2. 位段


2.1 什么是位段



  • data_type:表示位段的数据类型。通常可以是整数类型(例如int、char、unsigned int等),也可以是自定义的枚举类型等。
  • member_name:是位段的成员名,用于访问和操作该位段。
  • number_of_bits:是指定该位段所占用的位数。这决定了位段可以表示的最大值范围。通常情况下,位段的位数不能超过其数据类型所能表示的位数。


位段的声明和结构是类似的,有两个不同:


  1. 位段的成员必须是 int、unsigned int signed int
  2. 位段的成员名后边有一个冒号和一个数字
struct A
{
  int _a : 2;
  int _b : 5;
  int _c : 10;
  int _d : 30;
};


A就是一个位段类型。 那位段A的大小是多少?


printf("%d\n", sizeof(struct A));


运行结果:



解释:


       总共需要2个整型(int)来存储结构体struct A的位段成员。而一个整型通常占用4个字节(32位),所以结构体struct A的大小为8个字节。


2.2 位段的内存分配


  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
//一个例子
struct S
{
  char a : 3;
  char b : 4;
  char c : 5;
  char d : 4;
};
int main()
{
  struct S s = { 0 };
  s.a = 10;
  s.b = 12;
  s.c = 3;
  s.d = 4;
  return 0;
}


空间是如何开辟的?



2.3 位段的跨平台问题


  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。


总结: 跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。


位段的优点:


       位段允许将多个小的数据成员按位进行存储,从而节省内存空间。在某些嵌入式系统或资源受限的环境中,使用位段可以显著减小数据结构的内存占用。


【自定义类型引领视觉盛宴】(下):https://developer.aliyun.com/article/1424807

相关文章
|
7月前
|
存储 开发框架 .NET
【自定义类型引领视觉盛宴】(下)
【自定义类型引领视觉盛宴】(下)
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AI与创意产业:艺术与技术的交叉点
【10月更文挑战第10天】AI与创意产业的融合是未来的必然趋势。这种融合不仅改变了艺术创作的方式,还提升了创意产业的效率和创新能力。然而,我们也需要认识到AI在创意产业中的应用所面临的挑战和问题,并寻找解决方案。通过科技与艺术的跨界合作,我们可以共同推动创意产业的创新发展,为人类社会带来更多的美好和惊喜。 AI与创意产业的交叉点既是机遇也是挑战。只有不断探索和创新,我们才能在这个充满变革的时代中立于不败之地。
|
4月前
|
人工智能 Serverless
AI 创作风潮起:函数计算探索科技与艺术的无限可能
AI 创作风潮起:函数计算探索科技与艺术的无限可能。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在艺术创作中的角色:技术引领创新的艺术新篇章
【8月更文挑战第11天】AI在艺术创作中的角色正逐步从辅助工具转变为创新推动者。通过深度学习、自然语言处理、虚拟现实等先进技术,AI为艺术创作带来了无限可能性和创新空间。未来,随着技术的不断进步和应用的深入拓展,AI与艺术的交融将为我们呈现一个更加丰富多彩、充满活力的创意世界。让我们共同期待AI在艺术创作中的更多精彩表现!
|
5月前
|
人工智能
[AI 快手 LivePortrait] 引领高效肖像动画新时代
快手推出了 LivePortrait,具备拼接与重定向控制的高效肖像动画,下载代码,准备环境,下载预训练权重并开始推理。
[AI 快手 LivePortrait] 引领高效肖像动画新时代
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与艺术的融合:创意生成与审美判断的技术革新
【7月更文挑战第1天】人工智能与艺术融合,探索创意生成与审美判断的新边界。AI借助深度学习和GANs,生成图像、音乐和文本,革新艺术创作。同时,通过学习分析,AI在艺术鉴赏中提供客观审美判断,助力艺术家和观众理解作品。技术进步不断深化艺术与AI的合作,共创艺术未来。
|
人工智能 算法 数据可视化
使用AI焕发那场亚运的精彩--给回忆增添色彩,对未来充满期待
1974年9月1日,第七届亚洲运动会在伊朗首都德黑兰的阿里亚梅尔体育中心的主体育场开幕,这是新中国首次参加亚运会。而今正值亚运110周年,第19届杭州亚运会即将举办。本次通过参与“历久弥新——用 AI 修复亚运会珍贵史料”活动,使用阿里云的 AI 技术对亚运会历史老照片进行修复,重燃亚运经典,为亚运助威。
653 8
|
7月前
|
机器学习/深度学习 人工智能 算法
AI绘画与修图:重塑数字艺术的新纪元
AI绘画与修图:重塑数字艺术的新纪元
|
7月前
|
编解码
Sora的六大特点
【2月更文挑战第9天】Sora的六大特点
232 2
Sora的六大特点
|
7月前
|
存储 编译器 Linux
【自定义类型引领视觉盛宴】(上)
【自定义类型引领视觉盛宴】