【面试题】C++新特性(第六篇)

1.C++新标准

C++新标准是指C++编程语言的一系列更新和改进,这些标准为开发者提供了更多的工具和特性,使得C++成为一门更加现代化、高效且灵活的编程语言。以下是C++新标准的主要内容和特点,按照发布年份进行概述:

  1. C++11

    (发布于2011年):

    • 是C++98之后最具里程碑意义的版本。

    • 引入了许多现代C++的特性,如智能指针、多线程、并发编程、constexpr函数、lambda表达式、自动类型推导等。

    • 扩充了C++核心语言的功能,如右值引用和move语义、外部模板、初始化列表等。

    • 增强了C++标准程序库,包括线程支持、正则表达式、通用智能指针等。

  2. C++14

    (发布于2014年):

    • 是对C++11的小改进,主要集中在语言本身的修补和优化。

    • 放宽了constexpr函数的限制,增强了decltype关键字,并支持了lambda表达式的泛型编程。

  3. C++17

    (发布于2017年):

    • 在C++14的基础上进一步发展,引入了更多新特性。

    • 包括结构化绑定、if constexpr、折叠表达式、内联变量等。

    • 这些特性使C++的语法更加简洁、直观,提高了代码的可读性和可维护性。

  4. C++20

    (发布于2020年):

    • 是对C++17的延续和扩展。

    • 引入了概念(concepts)、协程(coroutines)、模块化(module)、三向比较运算符等新特性。

    • 这些特性提高了C++的表达能力和灵活性,使其更加适合现代软件开发的需要。

  5. C++23及以后:

    • C++标准遵循3年开发周期,并以发布年份命名。

    • 最近的C++23标准已完成更新并进入最终投票阶段,引入了模板参数捕获、可变参数模板等特性。

    • 预计中的C++26将在并发和并行性方面有重大改进,但目前尚未透露具体细节。

总之,C++新标准通过不断引入新特性和优化现有功能,使C++保持与现代编程趋势的同步,为开发者提供了更多工具和选择,以构建更高效、更安全、更易于维护的代码。

2.thread_local 线程本地化

线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在线程开始时分配,线程结束时回收,每个线程有该对象自己的实例**。

全局变量或静态变量会被放到".data"或".bss"段中,但当使用__declspec(thread)定义一个线程私有变量的时候,编译器会把这些变量放到PE文件的".tls"段中。

对于一个TLS变量来说,它有可能是一个C++的全局对象,那么每个线程在启动时不仅仅是复制".tls"的内容那么简单,还需要把这些TLS对象初始化,必须逐个地调用它们的全局构造函数,而且当线程退出时,还要逐个地将它们析构,正如普通的全局对象在进程启动和退出时都要构造、析构一样。

C++11引入了thread_local关键字用于下述情形:(1).命名空间(全局)变量;(2).文件静态变量;(3).函数静态变量;(4).静态成员变量。此外,不同编译器提供了各自的方法声明线程局部变量。thread_local作为类成员变量时必须是static的。

#include <iostream>
#include <thread>
​
thread_local int thread_value = 0;
​
void thread_function(int id){
    thread_value = id;
    std::cout<<"thread"<<id<<"thread_value ="<<thread_value<<std::endl;
}
​
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    std::thread t1(thread_function,1);
    std::thread t2(thread_function,2);
    t1.join();
    t2.join();
    std::cout<<"main"<<thread_value<<std::endl;
    return 0;
}
输出结果
threadthread2thread_value =2
1thread_value =1
main0

这表明每个线程都有自己独立的thread_specific_value副本,它们之间互不干扰。

thread_local 特点

  • 每个线程都有自己的变量副本,互不干扰。

  • 线程局部存储的变量在不同线程间是独立的,但在同一线程内是共享的。

  • thread_local变量的生命周期与线程的生命周期相同,即在线程创建时分配,在线程销毁时释放。

  • 可以用于解决多线程环境下的线程隔离问题,如线程特定配置或状态信息的存储。

future

在C++中,std::future 是C++11标准引入的一个模板类,它用于表示异步操作的结果。它提供了一种机制,使得一个线程可以等待另一个线程的结果,而无需阻塞当前线程的执行。

std::future 通常与 std::asyncstd::promisestd::packaged_task 一起使用。std::async 用于在单独的线程中启动一个异步任务,并返回一个 std::future 对象,该对象将保存异步操作的结果。std::promisestd::packaged_task 则允许你在一个线程中设置结果,并在另一个线程中通过 std::fut

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值