当前位置: 首页 > news >正文

设计做任务的网站怎样创建旅游网站

设计做任务的网站,怎样创建旅游网站,中国物联网公司排名,做视频网站盈利多少目录 一、section 二、aligned 三、packed 四、format 五、weak 六、alias 七、noinline和always_inline GNU C增加了一个__attribute__关键字用来声明一个函数、变量或类型的特殊属性,可以知道编译器在编译过程中进行特定方面的优化或代码检查。 目前&…

目录

一、section

二、aligned

三、packed

四、format

五、weak

六、alias

七、noinline和always_inline


GNU C增加了一个__attribute__关键字用来声明一个函数、变量或类型的特殊属性,可以知道编译器在编译过程中进行特定方面的优化或代码检查。

目前,__attribute__属性支持十几种属性声明:

section、aligned、packed、format、weak.......

一、section

section属性的作用是在程序编译时,将一个函数或变量放到指定的段,即section中。

一个可执行文件主要由代码段、数据段、BSS段构成。除了这三个段之外,可执行文件还包含其他一些段,如只读数据段,符号表等。在Linux系统中,可以使用readelf -S命令查看一个可执行文件的各个端信息,包括大小、起始地址等。

一般默认规则为

section组成
代码段(.text)函数定义、程序语句
数据段(.data)初始化的全局变量、初始化的静态局部变量
BSS段(.bss)未初始化的全局变量、未初始化的静态局部变量

 使用举例:

int val0 = 8;
int val1 __attribute__((section(".data")));
int main(void)
{return 0;
}

 此时我们用readelf查看,可以发现val1放在了数据段中。

二、aligned

aligned和packed是用来显式指定一个变量的存储对齐方式。aligned一般用来增大变量的地址对齐。

C语言中各种基本数据类型要按照自然边界对齐:一个char型的变量按照1字节对齐,一个short行的整型变量按照sizeof(short int)=2字节对齐,一个int型的整型变量要按sizeof(int)=4字节对齐。

C语言中不仅基本数据类型要按照自然边界对齐,复合数据类型也要按照各自的对其原则对齐。

结构体对齐原则如下:

  • 结构体内各成员按照各自数据类型的对齐模数对齐。
  • 结构体整体对齐方式:按照最大成员的size或其size的整数倍对齐。

联合体对齐原则如下:

  • 联合体的整体大小:最大成员对齐模数或对齐模数的整数倍。
  • 联合体的对齐原则:按照最大成员的对齐模数对齐。

如果你想定义一个变量,在内存中以8字节地址对齐,就可以如下:

int a __attribute__((aligned(8)));

 更甚,我们可以显式指定结构体内某个成员的地址对齐,也可以显示指定整个结构体的对齐方式。如:

struct data {char a;short b __attribute__((aligned(4)));int c;
}struct data {char a;short b;int c;
}__attribute__((aligned(16)));

 需要注意的是,编译器对每个基本数据类型都有默认的最大边界对齐字节数,如果超过了,编译器只能按照它规定的最大对齐字节数给变量分配地址。

总结:通过aligned属性声明,可以显示的指定变量的对齐方式,简化CPU和内存RAM之间的接口和硬件设计,但是也会因为边界对齐造成一定的内存空洞,浪费内存资源。

三、packed

aligned和packed是用来显式指定一个变量的存储对齐方式。packed一般用来减少变量的地址对齐。指定变量或类型使用最可能小的地址对齐方式。

如:

struct data {char a;short b __attribute__((packed));int c __attribute__((packed));
}struct data {char a;short b;int c;
}__attribute__((packed));

 这两种方式,结构体大小都为7。对整个结构体添加packed属性和分别对每个成员添加packed属性是一样的。

在内核源码中,我们经常看到aligned和packed一起使用,这样既避免了结构体内各成员因地址对齐产生内存空洞,又指定了整个结构体的对齐方式。

struct data {char a;short b;int c;
}__attribute__((packed,aligned(8)));

 这个结构体大小为8。

四、format

format属性可以指定变参函数的参数格式检查。

例如,我们实现一个自己的打印函数,为了确保传入参数的格式正确性,可以添加该属性。如:

#include <stdio.h>
#include <stdarg.h>
/*va_list:定义在编译器头文件stdarg.h中。va_start(fmt, args):根据参数args的地址,获取args后面参数的地址,并保存在fmt指针变量中va_end(args):释放args指针,将其赋值为NULL
*/void __attribute__((format(printf,1,2))) my_printf(char a, ...)
{va_list args;va_start(args, a);vprintf(a, args);va_end(args);
}int main(void)
{int num = 0;my_printf("hello world!\n", num);return 0;
}

五、weak

weak属性可以将一个强符号转换为弱符号。

使用方法如下:

void __attribute__((weak)) func(void);
int num __attribute__(weak);

强符号:函数名,初始化的全局变量名。

弱符号:未初始化的全局变量名。

 使用举例:

int a __attribute__((weak)) = 1;void f(void)
{printf("f:a = %d\n", a);
}int a = 4;int main(void)
{printf("main:a = %d\n", a);f();return 0;
}

程序运行结果如下:

main:a = 4
f:a = 4

六、alias

alias属性主要用来给函数定义一个别名。

void _f(void)
{printf("_f\n");
}void f() __attribute__((alias("_f")));int main(void)
{f();return 0;
}

程序运行结果如下:

_f

通过alias属性声明,我们给_f()函数定义了一个别名f(),以后如果想要调用_f()函数,则直接通过f()调用即可。

在Linux内核中,我们会发现alias有时会和weak属性一起使用。特别是当有些函数随着内核版本升级,函数接口发生了变化,我们可以通过alias属性对这个旧的接口名字进行封装,重新起一个接口名字。

//f.c
void _f(void)
{printf("_f()\n");
}void f() __attribute__((weak, alias("_f")));//main.c
void __attribute__((weak)) f(void);
void f(void)
{printf("f()\n");
}
int main(void)
{f();return 0;
}

如果我们在main.c中重新定义了f()函数,那么当main()函数调用f()函数时,会直接调用main.c中新定义的函数;当f()函数没有被定义时,则调用_f()函数。

七、noinline和always_inline

这两个属性的用途是告诉编译器,在编译时,对我们指定的函数内联展开或不展开。

使用方法为:

static inline __attribute__((noinline)) int func();
static inline __attribute__((always_inline)) int func();

使用inline声明的函数被称为内联函数,内联函数一般会有一个static或extern修饰。使用inline声明一个内联函数,和使用关键字register声明一个寄存器变量一样,只是建议编译器在编译时内联展开。编译器会根据实际情况(函数体大小、)来做决定。使用register修饰一个变量时,只是建议编译器在为变量分配存储空间时,将这个变量放到寄存器里,使程序的运行效率更高。编译器会根据寄存器资源是否紧张,这个变量的类型及是否频繁使用来做权衡。

但是,我们使用noinline和always_inline对一个内联函数做显式属性声明时,编译器的编译行为就变得确定了:使用noinline声明,就是告诉编译器不要展开;使用always_inline属性声明,就是告诉编译器要内联展开。

http://www.yayakq.cn/news/251390/

相关文章:

  • 做网站颜色类型是啥wordpress 编辑器 高亮 引用
  • 做网站,图片显示不出来第一次做网站做什么比较好
  • 网站建设维护管理办法网站设计开发是啥
  • 杭州做服装电商拿货的网站wordpress 提高速度
  • 备案价公示网站企业微信开发公司
  • 珠海网站建设联系方式苏州企业黄页
  • jsp网站 自动发送邮件北京专业网站翻译影音字幕翻译速记速记快而高效
  • 网站如何做反链湖南搜索引擎推广服务
  • 网站开发调查问卷题企业电话号码查询系统
  • 苏州网站开发建设电话网站调用谷歌地图
  • 珠海网站建设创意提交网站收录
  • 网络科技有限公司官网长春百度搜索优化
  • 株洲市哪里有做公司官方网站wordpress标题关键词描述
  • html 网站源码 卖手机深圳均安网站制作
  • 做网站那种语言好电脑版传奇
  • 万户网络做网站怎么样销售怎么做
  • 网站关键词密度是怎么计算的外包网站
  • 河南制作网站电话建设工程检测网
  • 上海网站设计与开发公司攸县网站建设
  • 服务器做网站流程如何做网站二维码
  • 注册网站费用明细网站建设多少钱裤
  • 芮城做网站的机构乐陵市住房和城乡建设局网站
  • 网站图片移动怎么做的北京房山网站建设产品更新培训
  • 公司网站有收录没排名北京seo诊断
  • 湖北省建设厅官方网站证书查询手机网页链接制作
  • 网站建设没业务黑帽seo技巧
  • 网站设计模板源码百度推广账户登陆
  • 旅游开发公司网站建设方案书长沙 微信群
  • 做企业网站市场分析赤壁市建设局网站
  • 比翼网站建设公司seo是什么级别