【深入理解C++编程_01】

系列文章目录



前言

与C语言相比

更关注性能

  • 与底层硬件紧密结合
  • 对象生命周期的精确控制
  • Zero-overhead Abstraction

引入大量特性,便于工程实践

  • 三种编程范式:面向过程、面向对象、泛型
  • 函数重载、异常处理、引用

一、与底层硬件紧密结合

在这里插入图片描述

  • 如图,一个格子表示一个字节,多字节保存时存在一个问题,一个数据存储时是从低位地址开始存储还是从高位存储呢?

在这里插入图片描述

  • 我们可以测试一下,经过测发现测试的计算机是小端存储的。

二、对象生命周期的精确控制

在这里插入图片描述

  • C++在try之后如果出现错误就会立刻销毁对象。
  • C#或其他语言在try出现错误后会消耗资源等待程序结束后在finally销毁。

三、zero-overhead abstraction

不需要为没有使用的语言特性付出成本

  • 堆栈
  • 编译期与运行期

比如分别在堆(new)和栈上开辟内存空间。

在这里插入图片描述

那么两者有什么区别呢


  • 在这里插入图片描述


  • 在这里插入图片描述

在堆上开辟空间的变量在访问的时候还要找到目标的地址
再取变量。
而在栈上开辟可以直接访问。
明显后者效率更高
但问题是不是所有语言都这样访问内存。

使用一些语言特性不等于付出运行期成本

在这里插入图片描述

C++代码有编译期与运行期的概念
如上图所示
consteval auto修饰的函数仅在编译期运行不在运行期运行
那么我们一次编译完成之后,每次运行都只执行
mov eax 990这一步操作
大大提升了运行效率。


C++ 的改进

平均每三年改进一次

  • C++98/03
  • C++11:引入内存模型、多线程、正则表达
  • 引入type_traits
  • C++14:改进上述特性等等
  • C++17:从标准库删除auto_ptr
  • C++20:引入ranges

工业界实现

光有标准还不够,要将代码编译出来还需要具体的实现。

  • MSVC(windows)/GCC(linux)/Clang(linux)
  • 每个编译器可能并不完全遵照标准,同一个代码在不同的编译器中的表现可能不同。
    clang10中不能识别consteval关键字将其编译了
    在这里插入图片描述

clang11识别到了consteval关键字没有进行编译
在这里插入图片描述


总结

  • 不能脱离具体的语境讨论C++
  • 编写程序时要注重
    • 性能
    • 标准
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值