gcc的编译属性和选项
1.指定内存默认对其参数:
__attribute__((packed)):按一字节对其
__attribute__((aligned(n))):从此之后默认按n字节对其
例如:
struct stu
{
int a;
char b;
}__attribute__((packed));
struct stu
{
int a __attribute__((aligned()));
char b;
};
例子:
#include <stdio.h> struct ss
{
char a __attribute__((aligned()));
int b;//① __attribute__((aligned(16)));
};//②__attribute__((aligned(16))); void main()
{
int i;
printf("%d\n", sizeof(struct ss));
struct ss s1 = {0x11, 0x55443322}; unsigned char *p = (unsigned char *)&s1; for(i=; i<sizeof(s1); i++)
{
printf("0x%x\n", *(p+i));
}
}
输出: 0x11
0xd1
0x98
0x0
0x22
0x33
0x44
0x55
0xe0
0xfc
0x98
0x0
0xf4
0xef
0x98
0x0
可以看出:
__attribute__((aligned(16)))在哪个域后面修饰哪个域(注意仅对此域有效,对其它域无效),更改了这个域的实际对齐参数,实际对齐参数决定了此域的起始存储位置,
再结合结构体的总大小必须能整除每一个域的最大对齐参数,因此可以推出来结构体的大小和内存的存储关系。
将结构体中注释掉掉的部分加上结构体大小就是32字节。
若只要③处,设定的只是结构体间对齐,结构体成员的存储顺序不变,只是结构体变长了。
1.1、结构体中含有位段的情况
#include <stdio.h> struct S3_1
{
char a;
short b : ;
short c : ;
short d : ;
int e : ;
int f : ;
}; struct S3_1 s3 = {0x11, , , , 0xf, 0x3f}; void main()
{
int i; printf("sizeof(s3)= %d\n", sizeof(s3)); unsigned char *p = (char *)&s3; for(i=; i<sizeof(s3); i++)
{
printf("0x%x\n", *(p+i));
}
}
①GNU的gcc编译器和Windows里的编译器的结果不一样,GNU的gcc输出:
sizeof(s3)=
0x11
0xff
0x3f
0x0
即最后面的int型的位段页归并到short里面一起用了。 ②在Window上gcc软件编译出输出:
sizeof(s3)=
0x11
0x0
0xf
0x0
0xff
0x3
0x0
0x0
和一般结构体对齐类似,只是其中的位是不是都占用而已。
2.__attribute__((weak))指定一个函数是若函数,消除链接时的multiple definition
例如:main.c
#include <stdio.h>
#define __weak __attribute__((weak))
void __weak func(void)
{
printf("%s\n", "void __atribute__(weak) func(void)");
}
void main()
{
func();
}
test.c中
#include <stdio.h>
void func(void)
{
printf("%s\n", "void func(void)");
}
3.__attribute__((regparm(0))):告诉gcc编译器该函数不需要通过任何寄存器来传递参数,参数只是通过堆栈来传递。
__attribute__((regparm(3))):告诉gcc编译器这个函数可以通过寄存器传递多达3个的参数,x86PC上,这3个寄存器依次为EAX、EDX 和 ECX。更多的参数才通过堆栈传递。这样可以减少一些入栈出栈操作,因此调用比较快。 ARM核默认是多于4个参数的会被保存在栈中
4.函数没有使用的参数后加__unused可防止编译器报警告
/*加上"__unused"可以防止编译器报警告:warning: unused parameter 'id' [-Wunused-parameter]*/
int led_module_open(const struct hw_module_t* module, const char* id __unused, struct hw_device_t** device) {
......
}
gcc的编译属性和选项的更多相关文章
- GCC编译命令常用选项
GCC是GUN Compiler Collection的简称,除编译程序外,还包含其他相关工具.GCC可将高级语言编写的源代码构建成计算机直接执行的二进制代码.GCC是Linux平台下最常用的编译程序 ...
- 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】
转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...
- Gcc的编译流程分为了四个步骤:
http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- GCC的编译和安装 很好的资料
http://blog.csdn.net/yrj/article/details/492404 1.GCC的编译和安装2.预处理 #define 可以支持不定数量的参数. 例子如下: ...
- Linux-编译器gcc/g++编译步骤
gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...
- GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 预处 ...
- 学习总结:gcc/g++ 编译与链接
gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...
- Nginx的编译安装及选项
编译安装Nginx1.安装常见的工具和库(GCC.PCRE.zlib.OpenSSL) Nginx是一个由C语言编写的,所以需要一个编译工具如GNU的GCC[root@www ~]# yum inst ...
随机推荐
- js 变量的声明能提升 初始化不会提升
var x = 5; // 初始化 x elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + & ...
- ASCII码,utf-8
ASCII:0-127表示英文,128-255每个国家编码不一样,汉字要使用两个字节,为了和0-127区别,首位都要是1,uriEncode就是把字符转换成ASCII码. utf-8,一个字节的,和a ...
- <Java><!!!><面试题>
装箱 & 拆箱 public class Test03 { public static void main(String[] args) { Integer f1 = 100, f2 = 10 ...
- ubuntu安装nodejs,npm live-server
sudo apt-get install curl 先安装的是curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/in ...
- QueryString中的加号变成空格解决方法
通过Request.QueryString["CheckItem"]的方式调用值的时候,数值中的加号“+”会转换为空格“ ” 例如传输“ABC+EFG”,就会取到“ABC EFG” ...
- reset.css 文件
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,b ...
- Spring Boot 揭秘与实战(七) 实用技术篇 - 异步任务
文章目录 1. Spring Boot 集成异步任务 2. 单发服务模式 3. 请求应答模式 4. 源代码 Spring 对异步任务具有很好的支持.这篇文章,我们透过 Spring Boot 来讲解下 ...
- 大数据-09-Intellij idea 开发java程序操作HDFS
主要摘自 http://dblab.xmu.edu.cn/blog/290-2/ 简介 本指南介绍Hadoop分布式文件系统HDFS,并详细指引读者对HDFS文件系统的操作实践.Hadoop分布式文件 ...
- elk的安装部署
Elk日志安装文档 需要用到有三个软件包 和redis 分布式部署:已上图就是分布式部署的架构图 Logstash : 是部署在前台的应用上,收集数据的 和部署在redis和elasticsea ...
- BF字符串匹配算法
Brute Force算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符: 若不相等,则比较S的第二个 ...