title | tags | renderNumberedHeading | grammar_cjkRuby |
---|---|---|---|
C++学习 |
true |
true |
[TOC]
- 游戏(Cocos2d-X)、图像、多媒体、网络、嵌入式
- 数据库(Oracle、MySQL)、浏览器(Chrome)、搜索引擎(Google)
- 操作系统、驱动程序、编译器(GCC、LLVM)、编程语言(Swift)
- HPC(High Performance Computing,高性能计算)
- IOS开发(Runtime、AsyncDisplayKit)
- Android开发(NDK、fresco【匿名共享内存,Ashmem,Anonymous Shared Memory】)
- Java开发(JNI)
- ……
==总结 #9C27B0==
- C++之所以应用范围如此广泛,得益于它的高效性、稳定性、跨平台性
- 虽然C++在很多大型应用中,无法施展拳脚;但在某些领域,如同巨人一般,而且是不可或缺的顶梁柱
- 基本只要是用到C++的地方,都是高大上的地方
- C++ 可以说是当今很多流行语言(Java、Python等)的老祖宗,学习C++,相当于理解了流行语言的前世今生
- 多尝试几种不同的编程语言,能提供不同的编程思维视角,站在更高的维度去思考代码
- C++是一门在面向过程和面向对象方面都比较完善的语言,能让我们更接近真相(本质)
- C++程序员转什么领域都可以很快上手
- 如果你想做个普通的程序员,学好所熟悉的语言基本够用,如果想要成为一个有生产力的程序员,C++是进阶必备
- 修炼内功,掌握本质,提升逼格
- 程序员鄙视链:汇编 ->C->C++ ->Java、C# ->PHP
-
每一门语言都有自己的优缺点,都有自己擅长的领域
-
新的编程语言趋向于更加简洁、高效(开发效率)
-
为了适应不同的应用场景,新的编程语言就诞生了
-
统计分析:R
-
网站开发:HTML、CSS、JavaScript
-
访问数据库:SQL
-
爬虫:Python
-
……
-
创造一门新的编程语言的成本,有时候会比改进一门编程语言的成本更低
- sizeof不是函数,是编译器特性
- C++中,++a是可以被赋值的,a ++不可以被赋值
- 对比if-else,编译器会对switch作一定的优化,提高执行效率
==汇编的格式和CPU架构有关==
- 编译型的语言(不依赖虚拟机) C/C++/OC/Swift
- 脚本语言 Python/JS/PHP
- 编译型的语言(依赖虚拟机) Java/Ruby
https://visualstudio.microsoft.com
.vs目录是用来存储当前用户在解决方案中的工作配置,具体包括VS关闭前最后的窗口布局、最后打开的选项卡/操作记录/文件文档、某些自定义配置/开发环境、调试断点等这类设置信息和状态。这样每当用户关闭解决方案后再重新打开,就能继续之前的工作状态。
在VS2015之前的版本,这些信息都是散乱的保存在解决方案根目录下(最明显的参照物就是.suo文件),现在是将这些统一放在.vs这个隐藏文件夹里,如果没在Windows系统中开启查看隐藏的文件和文件夹,还是很容易无视的。
sln文件是整个解决方案的配置文件,(Microsoft Visual Studio Solution),通过为环境提供对项目、项目项和解决方案在磁盘上的位置的引用,可以将他们组织到解决方案中。
vcxproj文件是项目文件,保存了整个项目的配置信息。经过测试可以通过打开这个文件来直接打开这个项目以及解决方案。
vcxproj.filters文件是文件存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。
一般情况下,如果我们要把源码共享到github中,只需要提交工程相关的配置文件,不提交用户个人偏好相关的配置文件。所谓的个人偏好相关,是指根据用户个人的VS使用习惯而保存的配置信息,比如选择了查看所有文件选项,打开了某一个文件。而工程相关的配置是指工程建立相关的信息,不受用户偏好的影响,比如解决方案的名字是什么,这个解决方案下面有哪些project。所以,我们只需要上传sln配置文件、vcxproj和vcxproj.filters配置文件就可以了,当然还包括源码。
用Java中的说法就是方法签名=方法名+参数类型,方法名相同,方法签名不同即为函数重载
因为函数体过于简单,所以编译器会做优化,禁止优化即可在IDA中看到call的过程
默认参数只是编译器帮我们做了些事情,函数调用的时候可以不传默认参数,但实际反汇编看到的还是连同默认参数都会push入栈
CPP想要调用C语言开发的第三方库,需要在声明中加extern"C",否则CPP的Name Decoration会导致编译报错,所以第三方库的头文件需要加extern"C",但此时C文件调用C写的第三方库时又会报错,原因是C语言源文件是不认识 extern"C"的,所以有个需求就是希望头文件在CPP中自动加上 extern"C,C文件就不要加,刚好在CPP文件中会自动定义__cplusplus这个宏,所以可以通过这个宏来区分是不是CPP环境
第三方库函数之间可能会发生相互调用,例如前面的函数调用后面的函数,所以第三方库包含自己的头文件也是很有必要的事情
一个头文件可能会多次包含,虽然多次声明不会报错,但是编译器预处理会浪费更多的时间,所以头文件也需要用宏来控制条件预编译,宏的名称也是随意的,但是有概率性两个不同头文件用了同一个宏,导致出错,所以约定俗称用文件名前后各加两个下划线
#ifndef、#define、#endif可以针对一个文件中的部分代码,而#pragma once只能针对整个文件