编译器优化

CRT的来历

◇◆丶佛笑我妖孽 提交于 2019-11-27 02:24:57
之前由于要研究一下VC编译选项对于最终编译出来的模块尺寸的影响,所以就顺便研究了一下Windows的CRT库的相关知识,收集如下: (转载自:http://www.cnblogs.com/chio/archive/2007/11/26/972152.html) [关于CRT]   CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的开发及运行。后来在此基础上开发了C++ Runtime Library,所以现在CRT是指Microsoft开发的C/C++ Runtime Library。在VC的CRT/SRC目录下,可以看到CRT的源码,不仅有C的,也有C++的。   CRT原先的目的就是支持操作系统的运行。因为Windows操作系统除汇编部分外,都是用C/C++编写的,所以内核及许多关键服务都在CRT上运行(它们都采用dll技术动态链接)。此外,用 VC编写的C/C++程序也用到它们(可以动态链接,也可以静态链接,前者运行时需要系统中已安装CRT的dll,后者不需要)。可以说,CRT就是 Microsoft编写Windows时使用的低层类库。然后,它又被当作C++标准库的一个实现包含在了VC系列中;我们在VC中使用的C++标准库, 其实就是CRT的一个真子集(少了C++标准所不包含的代码,特别是大量的低层C代码)。  

Java 基础语法

泪湿孤枕 提交于 2019-11-27 00:26:32
目录 Java 基础语法 1. 常量(6种) 2. 基本数据类型(4类8种) 3. 变量 4. 数据类型装换 5. 数字和字符的对照关系表(编码表) 6. 运算符 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 5. 三元运算符 6. 普通方法 7. jshell 8. 编译器的两点优化 1. 编译器的隐含强制类型转换 2. 编译器的常量优化 9. 方法的重载(Overlaod) Java 基础语法 1. 常量(6种) 常量:在程序运行期间,不可改变的量。 字符串常量:“abc" 字符常量:'a' 整型常量:123 浮点型常量:3.14 布尔常量:true、false 空常量:null 注意事项: 字符常量单引号中的字符有且仅有一个,没有不行,多个也不行。 不能直接打印空常量。 2. 基本数据类型(4类8种) 整数型:byte、short、int、long 浮点型:float、double 字符型:char 布尔型:boolean 注意事项: 字符串不是基本类型,而是引用类型。 浮点型可能只是一个近似值,并非精确的值。 数据范围与字节数不一定相关,例如:float 数据范围比 long 更加广泛,但是 float 是4字节,long 是8字节。 浮点数当中默认类型是 double,如果一定要是用 float 类型,需要加上一个后缀 F。 如果是整数,默认为

C++--第3课 - 函数的升级-上

与世无争的帅哥 提交于 2019-11-27 00:08:07
第3课 - 函数的升级-上 1. 常量与宏回顾 C++中能够的const常量可以代替宏常数定义,如: const int A = 3; #define A 3 在C++中的解决方案是代替宏代码片段,宏代替代码片段可以避免宏的副作用。 2. 内联函数 (1)C++中推荐使用内联函数代替宏代码片段。C++中使用inline关键字声明内联函数 inline int func(int a, int b) { return a < b ? a : b; } 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内敛请求。 (2)C++编译器可以将一个函数进行内敛编译。被C++编译器内敛编译的函数叫做内联函数。 内联函数在最终生成的代码中是没有定义的。C++编译器直接将函数体插入函数调用的地方。内敛函数没有普通函数调用时候的额外开销(压栈,跳转,返回)。但是,C++编译器不一定会准许函数的内链请求。 (3)内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)。内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求。内敛函数由编译器处理,直接将编译后的函数体插入到调用的地方。然而,宏代码片段由预处理器处理,进行简单的文本变换,没有任何的编译过程。现在的C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也能被编译器内联编译。另外

Java并发指南6:Java内存模型JMM总结

倖福魔咒の 提交于 2019-11-26 23:23:03
在前面的文章中我们介绍了Java并发基础和线程安全的概念,以及JMM内存模型的介绍,包括其定义的各种规则。同时我们也介绍了volatile在JMM中的实现原理,以及Lock锁和synchronized实现同步方式的区别。最后还讲述了final关键字在JSR-133中的语义加强。 介绍了这么多内容,主要还是围绕着JMM来讲的,所以本文再次对JMM做一个总结。 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。 根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面几种类型: 放松程序中写-读操作的顺序,由此产生了total store ordering内存模型(简称为TSO)。 在前面1的基础上,继续放松程序中写-写操作的顺序,由此产生了partial store order 内存模型(简称为PSO)。 在前面1和2的基础上,继续放松程序中读-写和读-读操作的顺序,由此产生了relaxed memory order内存模型(简称为RMO)和PowerPC内存模型。 注意,这里处理器对读/写操作的放松

Java并发指南2:深入理解Java内存模型JMM

走远了吗. 提交于 2019-11-26 23:17:23
一:JMM基础与happens-before 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。 同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。 Java内存模型的抽象 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。如果编写多线程程序的Java程序员不理解隐式进行的线程之间通信的工作机制,很可能会遇到各种奇怪的内存可见性问题。 在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用“共享变量”这个术语代指实例域,静态域和数组元素)。局部变量(Local variables),方法定义参数(java语言规范称之为formal

inline,宏定义,static,extern

六月ゝ 毕业季﹏ 提交于 2019-11-26 21:49:56
inline一般用于定义代码简洁,耗时短,不像宏定义是在预编译阶段替换,inline是在汇编阶段替换,效果一样。 一般编译器进行优化的时候会对简短方法进行这种优化,不进行声明也会进行inline,如果显示的声明为inline,会增大最后代码的大小。最终是否优化由编译器决定,这样声明了可以在头文件中定义,不用担心重复定义。 static是告诉链接器,当前文件定义的方法和变量只有当前模块可用,不能被其他的模块使用。 注意,对于 include 方式进行包含的没有影响。 include 实际是对整个文件进行包含。这个一般是对于库与库,或者 .o 与 .o 之间,可见范围由编译器进行分隔。 extern是告诉编译器,如果当前项目没有定义相关的变量, 不需要报错,在链接阶段一定会有相关的定义的。 和static 有些类似,也是使用于模块与模块之间的。 宏定义是在预编译阶段就进行替换。 可以通过 g++ -E source.cpp 的方式查看替换后的代码。 /* [root@localhost definecompile]# g++ -E test.cpp # 1 "test.cpp" # 1 "<built-in>" # 1 "<命令行>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<命令行>" 2 # 1 "test.cpp" */ int

inline,宏定义,static,extern

ⅰ亾dé卋堺 提交于 2019-11-26 21:29:25
inline一般用于定义代码简洁,耗时短,不像宏定义是在预编译阶段替换,inline是在汇编阶段替换,效果一样。 一般编译器进行优化的时候会对简短方法进行这种优化,不进行声明也会进行inline,如果显示的声明为inline,会增大最后代码的大小。最终是否优化由编译器决定,这样声明了可以在头文件中定义,不用担心重复定义。 static是告诉链接器,当前文件定义的方法和变量只有当前模块可用,不能被其他的模块使用。 注意,对于 include 方式进行包含的没有影响。 include 实际是对整个文件进行包含。这个一般是对于库与库,或者 .o 与 .o 之间,可见范围由编译器进行分隔。 extern是告诉编译器,如果当前项目没有定义相关的变量, 不需要报错,在链接阶段一定会有相关的定义的。 和static 有些类似,也是使用于模块与模块之间的。 宏定义是在预编译阶段就进行替换。 可以通过 g++ -E source.cpp 的方式查看替换后的代码。 /* [root@localhost definecompile]# g++ -E test.cpp # 1 "test.cpp" # 1 "<built-in>" # 1 "<命令行>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<命令行>" 2 # 1 "test.cpp" */ int

方舟编译器源代码疑似曝光,华为李小龙:来自服务器部门?

穿精又带淫゛_ 提交于 2019-11-26 16:34:21
前几天,赶在华为开发者大会开幕前几天,华为已经在官方社区正式公布了方舟编译器的安装详情以及下载地址。 官方介绍称,方舟编译器是基于GCC开发的交叉编译器套件,它包括了C、C++、Fortran的前端,也包括了这些语言的库(如libstdc++、libgcc等)。HCC运行在X86 linux架构服务器上,生成的二进制运行在Aarch64架构服务器上。 来源:tsuki 链接: https://www.zhihu.com/question/338350284 添加描述 引起争议后,华为手机产品线副总裁李小龙在微博上对“GCC套皮说”进行了辟谣,他表示:「这个网站不是华为消费者BG维护的网站,此编译器好像是服务器部门用的,和我们之前和P30一起发布的方舟编译器没有任何关系。」 链接: https://www.zhihu.com/question/338350284/answer/776111129 华为副总裁在微博说这是另一个 BG 的同名产品。那我们继续等待几天后真正的方舟编译器吧。 原答案: 下载页的开始称方舟编译器叫 HCC: 添加描述 我们从标注着 源码下载 的链接这里,下载传说中的方舟编译器: 添加描述 下载下来的 tar 包却叫 gcc-ark: 添加描述 解压缩一看,没找到任何名称中含 ark/fangzhou/hcc/huawei 等单词的文件,却和我刚从 Arch

C++中this指针的用法详解

孤街浪徒 提交于 2019-11-26 14:03:51
1. this指针的用处:   一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。 例如,调用date.SetMonth(9) <==> SetMonth(&date, 9),this帮助完成了这一转换 . 2. this指针的使用: 一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 3. this指针程序示例: this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。 根据以下程序来说明this指针 #include    class Point    {    int x, y;    public:    Point(int a, int b) { x=a; y=b;}    void MovePoint( int a, int b){ x+=a; y+=b;}    void print(){ cout<<"x="<<x<<"y

C++应用程序性能优化(三)——C++语言特性性能分析

半世苍凉 提交于 2019-11-25 21:08:27
C++应用程序性能优化(三)——C++语言特性性能分析 一、C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序。因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性。新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降。 但事实并非如此,通常一个程序的速度在框架设计完成时大致已经确定,而并非因为采用C++语言才导致速度没有达到预期目标。因此,当一个程序的性能需要提高时,首先需要做的是用性能检测工具对其运行的时间分布进行一个准确的测量,找出关键路径和真正的性能瓶颈所在,然后针对性能瓶颈进行分析和优化,而不是主观地将性能问题归咎于程序所采用的语言。工程实践表明,如果框架设计不做修改,即使使用C语言或汇编语言重新改写,也并不能保证提高总体性能。 因此,遇到性能问题时,首先应检查和反思程序的总体架构,然后使用性能检测工具对其实际运行做准确的测量,再针对性能瓶颈进行分析和优化。 但C++语言中确实有一些操作、特性比其它因素更容易成为程序的性能瓶颈,常见因素如下: (1)缺页 缺页通常意味着要访问外部存储