当前位置: 首页 > news >正文

《深入理解C++11:C++11新特性解析与应用》笔记八

第八章 融入实际应用

8.1 对齐支持

8.1.1 数据对齐

c++可以通过sizeof查询数据的长度,但是没有对对齐方式有关的查询或者设定进行标准化。c++11标准定义的alignof函数可以查看数据的对齐方式。

现在的计算机通常会支持许多向量指令,4组8字节的浮点数据,很有潜力改造为能直接操作的向量数据,而默认的对齐方式是8字节的,我们最好能将其对齐在32字节的地址边界上。需要利用c++11新提供的修饰符alignas来重新设定对齐方式。

8.1.2 c++11的alignof和alignas

c++11在新标准中为了支持对齐,主要引入了两个关键字:操作符alignof、对齐描述符alignas。

alignof的操作数表示一个定义完整的自定义类型或者内置类型或者变量,返回值是一个std::size_t类型的整型常量。

alignas既可以接受常量表达式,也可以接受类型作为参数。常量表达式的结果必须是以2的自然数幂次作为对齐值。值越大,表示对齐要求越高。

c++11标准中规定了一个基本对齐值,一般情况下等于平台上支持的最大标量类型数据的对齐值(通常为long double)。我们可以通过alignof(std::max_align_t)来查询其值。设定超过标准对齐的做法叫做扩展对齐。

对齐描述符可以作用于各种数据,可以修饰变量、类的数据成员等,而位域以及用register声明的变量则不可以。

c++11stl库还内建了std::align函数来动态地根据指定的对齐方式调整数据块的位置。

该函数在ptr指向的大小为space的内存中进行对齐方式的调整,将ptr开始的size大小的数据调整为按alignment对齐。

c++11还在标准库中提供了aligned_storage及aligned_union供程序员使用。

8.2 通用属性

8.2.1 语言扩展到通用属性

编译器厂商或组织为了满足编译器客户的需求,设计出了一系列的语言扩展来扩展语法,最常见的就是属性(attribute)。属性是对语言中的实体对象(比如函数、变量、类型等)附加一些的额外注解信息,其用来实现一些语言及非语言层面的功能,或是实现优化代码等的一种手段。

不同的编译器有不同的属性语法,比如对于g++,属性是通过GNU的关键字__attribute__来声明的:__attribute__((attribute-list))。而Windows平台上,则使用关键字__declspec:__declspec(extended-decl-modifier)。c++11的通用属性采用了不一样的设计。

8.2.2 c++11的通用属性

c++11语言中的通用属性使用了左右双中括号的形式:[[attribute-list]]。这样设计的好处是既不会消除语言添加或者重载关键字的能力,又不会占用用户空间的关键字的名字空间。

语法上,c++11的通用属性可以作用于类型、变量、名称、代码块等。对于作用于声明的通用属性,既可以写在声明的开始处,也可以写在声明的标识符之后。而对于作用于整个语句的通用属性,则应该写在语句起始处。而出现在以上两种规则描述的位置之外的通用属性,作用于哪个实体跟编译器具体的实现有关。

现有c++11标准中,只预定义了两个通用属性,分别是[[noreturn]]和[[carries_dependency]]。

8.2.3 预定义的通用属性

[[noreturn]]是用于标识不会返回的函数的。不会返回的函数在被调用完成后,后续代码不会再被执行。主要用于标识哪些不会将控制流返回给原调用函数的函数。典型的例子是:有终止应用程序语句的函数、有无限循环语句的函数、有异常排除的函数等。通过该属性能帮助编译器产生更好的告警信息,同时编译器也可以做更多的诸如死代码消除、免除为函数调用者保存一些特定寄存器等代码优化工作。

[[carries_dependency]]则跟并行情况下的编译器优化有关。事实上,[[carries_dependency]]主要是为了解决弱内存模型平台上使用memory_order_consume内存顺序枚举问题。该通用属性既可以标识函数参数,又可以标识函数的返回值。当标识函数的参数时,它表示数据依赖随着参数传递进入函数,即不需要产生内存栅栏。而当标识函数的返回值时,它表示数据依赖随着返回值传递出函数,同样也不需要产生内存栅栏。

8.3 Unicode支持

8.3.1 字符集、编码和Unicode

通常,我们称ISO/Unicode所定义的字符集为Unicode。在Unicode中,每个字符占据一个码位(code point)。Unicode字符集共定义了1114112个这样的码位,使用从0到10FFFF的十六进制数唯一地表示所有的字符。由于计算机存储数据通常是以字节为单位,而且出于兼容之前的ASCII、大数小段数段、节省存储空间等诸多原因,通常需要一种具体的编码方式来对字符码位进行存储。比较常见的基于Unicode字符集的编码方式有UTF-8、UTF-16及UTF-32。

以UTF-8为例,其采用了1-6字节的变长编码方式编码Unicode,英文通常使用1字节表示,且与ASCII是兼容的,而中文常用3字节进行表示。UFT-8编码由于较为节约存储空间,因而使用得比较广泛。

在中文地区我们还有一些常见的字符集及其编码方式,GB2312、Big5是其中影响最大、使用最广泛的两种。

8.3.2 c++11中的Unicode支持

c++98标准中,为了支持Unicode,定义了宽字符的内置类型wchar_t。在Windows上,多数wchar_t被实现为16位宽,而Linux上则被实现为32位。C++98标准定义中,wchar_t的宽度是由编译器实现所决定的,理论上可以是8位、16位或者32位。带来的问题是包含wchar_t的代码通常不可移植。

c++11引入两种新的内置数据类型来存储不同编码长度的Unicode数据:

char16_t:用来存储UTF-16编码的Unicode数据。

char32_t:用来存储UTF-32编码的Unicode数据。

至于UTF-8编码的Unicode数据,c++11还是使用8字节宽度的char类型的数组来保存。

此外,c++11还定义了一些常量字符串的前缀,这些前缀可以让编译器使字符串按照前缀类型缠身数据:

u8表示为UTF-8编码,u表示为UTF-16编码,U表示为UTF-32编码。(wchar_t的前缀是L)。

按照c/c++的规则,连续在代码中声明多个字符串字面量,则编译器会自动将其连接起来。一旦连续声明多个字符串字面量中的某一个是前缀的,则不带前缀的字符串字面量会被认为与带前缀的字符串字面量是同类型的。

对于Unicode编码字符串的书写,c++11中还规定了一些简明的方式,即在字符串中用‘\u’加4个十六进制数编码的Unicode码位(UTF-16)来标识一个Unicode字符。

相比于定长编码的UTF-16,变长编码的UTF-8的优势在于支持更多的Unicode码位,而且也没有大数大小端问题。不过不能直接数组式访问是UTF-8的最大缺点。此外c++11为char16_t和char32_t分别配备了u16string和u32string等字符串类型,却没有u8string。

现有的c++编程中,总是倾向于在I/O读写的时候采用UTF-8编码,内存中一直操作的是定长的Unicode编码。

8.3.3 关于Unicode的库支持

c11库中新增了一些编码转换函数来完成各种Unicode编码间的转换。

c++对字符转换的支持则稍微复杂一些,新方法需要源自于c++的locale机制的支持。在c++中,通常情况下,locale描述的是一些必须知道的区域特征,如程序运行的国家/地区的数字符号、日期表示、钱币符号,采用的字符集和编码等。

地区的某个特征叫做facet。c++中常见的facet除去num_get/num_put(数值存取)、money_get/money_put等外,还有一种就是codecvt。codecvt能够完成从当前locale下多字符编码字符串到多种Unicode字符编码转换。

c++标准中,规定一共需要实现4种这样的codecvt facet:

考虑到Unicode在序列化存储的时候很少是UTF-16或者UTF-32的,所以从实际出发,没有在c++11中提供支持该功能的u16ifstream、u32ofstream等。

8.4 原生字符串字面量

原生字符串使用用户书写的字符串所见即所得,不再需要如'\t'、'\n'等控制字符来调整字符串中的格式。

c++11中只需要在字符串前加入前缀字母R,并在引号中使用括号左右标识,就可以声明该字符串字面量为原生字符串了。

对于Unicode的字符串,也可以使用相同的方式声明,前缀分别为u8R,uR,UR。使用原生字符串的话,转义字符就不能使用了。原生字符串字面量也遵从连接规则。

相关文章:

《深入理解C++11:C++11新特性解析与应用》笔记八

第八章 融入实际应用 8.1 对齐支持 8.1.1 数据对齐 c可以通过sizeof查询数据的长度,但是没有对对齐方式有关的查询或者设定进行标准化。c11标准定义的alignof函数可以查看数据的对齐方式。 现在的计算机通常会支持许多向量指令,4组8字节的浮点数据&a…...

算法——BFS解决FloodFill算法

什么是FloodFill算法 中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(…...

【Linux】常用的基本命令指令②

前言:前面我们学习了Linux的部分指令,今天我们将接着上次的部分继续将Linux剩余的基本指令. 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:Linux的学习 👈 💯代码仓库:卫卫周大胖的学习日记…...

52、全连接 - 特征与样本空间的对应关系

上一节说到经过全连接层之后,神经网络学习到的特征,会从隐层特征空间逐步映射到样本空间,这主要是由于全连接层可以融合全局的特征。 在经过全连接层之后,在 ResNet50 这个神经网络中会输出1000个特征的得分值,这1000个特征的得分值,便可以对应到图像的分类。 怎么对应…...

Go语言中的包管理工具之Go Vendor的使用

GoLang 中常用的包管理的方式 常用的有三种 Go PathGo VendorGo Modules 关于 Go Vender 1 )概述 在2015年的时候,我们的另一个包管理工具Go Vendor就诞生了它诞生于 2015.8.19 ,是在Go的 1.5 版本当中引入的,它默认是关闭的我…...

QString设置小数点精度位数

QString设置小数点精度位数 Chapter1 QString设置小数点精度位数Chapter2 Qt中QString.toDouble有效位数6位问题以及数据小数点有效位数的处理问题一:QString.toDouble有效位只有6位问题二:小数点有效位数的问题 Chapter3 qt QString转Double只显示6位数字的问题(精…...

基于Java驾校预约管理系统

基于Java的驾校预约管理系统是一个为驾校提供在线预约服务的系统。该系统利用Java编程语言,采用SSM框架,并使用MySQL数据库进行开发。 这个系统主要有三个角色:用户、教练和管理员。 用户可以注册和登录系统,查看驾校的公告信息…...

C++面向对象高级编程(侯捷)笔记2

侯捷C面向对象高级编程 本文是学习笔记,仅供个人学习使用,如有侵权,请联系删除。 如果你对C面向对象的组合、继承和委托不了解,对什么是拷贝构造、什么是拷贝赋值和析构不清楚,对类设计中的Adapter、pImpl、Template…...

双曲正弦函数(*) 优化麦克劳林公式

#include<stdio.h> #include<math.h> int main() {double x,eps,i3,y,item;scanf("%lf%lf",&x,&eps);yx;itemx;while(fabs(item)>eps){itemitem*x*x/i/(i-1);i2;yitem;}printf("%.6f\n",y);return 0; }...

无监督关键词提取算法:TF-IDF、TextRank、RAKE、YAKE、 keyBERT

TF-IDF TF-IDF是一种经典的基于统计的方法&#xff0c;TF(Term frequency)是指一个单词在一个文档中出现的次数&#xff0c;通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数&#xff0c;通常一个单词…...

web3 : blockscout剖析

Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。 目录 Blockscout可以做什么主要特征blockscoutDocker容器组件Postgres 1…...

【机器学习基础】DBSCAN

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;相对完整的机器学习基础教学&#xff01; ⭐特别提醒&#xff1a;针对机器学习&#xff0c;特别开始专栏&#xff1a;机器学习python实战…...

计算机硬件 4.4键盘与鼠标

第四节 键盘与鼠标 一、认识键盘 1.地位&#xff1a;计算机系统最基本的输入设备。 2.外观结构&#xff1a;面板、键帽、底盘、数据线。 3.组成键区&#xff1a;主键区、功能键区、辅助键区和编辑&#xff08;控制&#xff09;键区。 二、键盘分类 1.按接口分 ①AT口&…...

Flappy Bird QDN PyTorch博客 - 代码解读

Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中&#xff0c;我们将介绍如何使用QDN&#xff08;Quantile Dueling Network&#xff09;算法&#xf…...

听GPT 讲Rust源代码--compiler(9)

File: rust/compiler/rustc_trait_selection/src/traits/select/mod.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_trait_selection/src/traits/select/mod.rs文件的作用是实现Rust编译器的trait选择器。 首先&#xff0c;让我们逐个介绍这些struct的作用&#xff1a; Se…...

Go语言中关于go get, go install, go build, go run指令

go get go get 它会执行两个操作 第一个, 是先将远程的代码克隆到Go Path的 src 目录那二个, 是执行go install命令 那如果指定的包可以生成二进制文件那它就会把这个二进制文件保存到这个 Go Path 的bin目录下面这是 go install 命令执行的操作 如果只需要下载包&#xff0c…...

石头剪刀布游戏 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则: 出拳形状之间的胜负规则如下: A>B; B>C; C>A; 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。…...

【北亚服务器数据恢复】ZFS文件系统服务器ZPOOL下线的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器中有32块硬盘&#xff0c;组建了3组RAIDZ&#xff0c;部分磁盘作为热备盘。zfs文件系统。 服务器故障&#xff1a; 服务器运行中突然崩溃&#xff0c;排除断电、进水、异常操作等外部因素。工作人员将服务器重启后发现无法进入操作系统。…...

C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry

文章目录 前言反射是什么&#xff1f;常用类型操作SummryPropertyInfoMethodInfo无参函数运行 有参函数运行,获取paramterInfo 总结 前言 我之前写了一篇Attribute特性的介绍&#xff0c;成功拿到了Attribute的属性&#xff0c;但是如果把Attribute玩的溜&#xff0c;那就要彻…...

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…...

谷歌推出创新SynCLR技术:借助AI生成的数据实现高效图像建模,开启自我训练新纪元!

谷歌推出了一种创新性的合成图像框架&#xff0c;这一框架独特之处在于它完全不依赖真实数据。这个框架首先从合成的图像标题开始&#xff0c;然后基于这些标题生成相应的图像。接下来&#xff0c;通过对比学习的技术进行深度学习&#xff0c;从而训练出能够精准识别和理解这些…...

Vue2中使用echarts,并从后端获取数据同步

一、安装echarts npm install echarts -S 二、导入echarts 在script中导入&#xff0c;比如&#xff1a; import * as echarts from "echarts"; 三、查找要用的示例 比如柱状图 四、初始化并挂载 <template><div id"total-orders-chart" s…...

【Redux】自己动手实现redux-thunk

1. 前言 在原始的redux里面&#xff0c;action必须是plain object&#xff0c;且必须是同步。而我们经常使用到定时器&#xff0c;网络请求等异步操作&#xff0c;而redux-thunk就是为了解决异步动作的问题而出现的。 2. redux-thunk中间件实现源码 function createThunkMidd…...

ElasticSearch使用Grafana监控服务状态-Docker版

文章目录 版本信息构建docker-compose.yml参数说明 创建Prometheus配置文件启动验证配置Grafana导入监控模板模板说明 参考资料 版本信息 ElasticSearch&#xff1a;7.14.2 elasticsearch_exporter&#xff1a;1.7.0&#xff08;latest&#xff09; 下载地址&#xff1a;http…...

VS Code 如何调试Python文件

VS Code中有1,2,3处跟Run and Debug相关的按钮&#xff0c; 1 处&#xff1a;调试和运行就不多说了&#xff0c;Open Configurations就是打开workspace/.vscode下的lauch.json文件&#xff0c;而Add Configuration就是在lauch.json文件中添加当前运行Python文件的Configuratio…...

day06、SQL语言之概述

SQl 语言之概述 6.1 SQL语言概述6.2 SQL语言之DDL定义数据库6.3 SQL语言之DML操纵数据库 6.1 SQL语言概述 6.2 SQL语言之DDL定义数据库 6.3 SQL语言之DML操纵数据库...

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展&#xff0c;3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比&#xff0c;3D目标检测可以在三维空间中对物体进行定位和识别&#xff0c;具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…...

让设备更聪明 |启英泰伦离线自然说,开启智能语音交互新体验!

语音交互按部署方式可以分为两种&#xff1a;离线语音交互和在线语音交互。 在线语音交互是将数据储存在云端&#xff0c;其具备足够大的存储空间和算力&#xff0c;可以实现海量的语音数据处理。 离线语音交互是以语音芯片为载体&#xff0c;语音数据的采集、计算、决策均在…...

React Hooks之useState、useRef

文章目录 React Hooks之useStateReact HooksuseStatedemo&#xff1a;在函数式组件中使用 useState Hook 管理计数器demo&#xff1a;ant-design-pro 中EditableProTable组件使用 useRef React Hooks之useState React Hooks 在 React 16.8 版本中引入了 Hooks&#xff0c;它是…...

提供电商Api接口-100种接口,淘宝,1688,抖音商品详情数据安全,稳定,支持高并发

Java是一种高级编程语言&#xff0c;由Sun Microsystems公司于1995年推出&#xff0c;现在属于Oracle公司开发和维护。Java以平台无关性、面向对象、安全性、可移植性和高性能著称&#xff0c;广泛用于桌面应用程序、嵌入式系统、企业级服务、Android移动应用程序等。 接口是Ja…...

银川网站推广/seo狂人

我们经常需要写代码&#xff0c;查看代码&#xff0c;查看代码时一般会用记事本&#xff0c;但是记事本的功能太弱&#xff0c;而写代码时有的编译器大的编辑功能太弱&#xff0c;像IAR keil之类的&#xff0c;因此需要一个小巧好用的替代记事本的编辑软件。Notepad我用了很久了…...

千度网站/超级推荐的关键词怎么优化

红黑树的性质&#xff0c;各个操作的具体步骤在 透彻了解红黑树之一 透彻了解红黑树之二 透彻了解红黑树之三 透彻理解红黑树之四 透彻理解红黑树之五&#xff0c;中已经讲的很详细了&#xff0c;在这里只将代码实现贴出来&#xff1a; BRTreeNode.h #include<iostream…...

想做外贸去哪个网站做/站群seo

使用Script中的Defer属性。script中的defer属性默认情况下是false的。也就是说&#xff1a;如果是编写脚本的时候加入defer属性&#xff0c;那么浏览器在下载脚本的时候就不必立即对其进行处理&#xff0c;而是继续对页面进行下载和解析&#xff0c;这样会提高下载的性能。这样…...

关于建设网站的培训知识/推广网站seo

西雅图IT圈&#xff1a;seattleit【今日作者】栗头蓝一个充满着人文情怀的web前端相声演员特朗普的移民政策让那些新近H-1B签证申请人的日子越来越难过了有多难过&#xff1f;美国移民局2018年最后三个月的数据显示&#xff0c;有四分之一的H-1B申请被拒。对比四年前&#xff0…...

导航网站的广告怎么做的/小程序开发一个多少钱啊

pymysql.err.InterfaceError: (0, ‘’)解决办法 导致这个错误的原因是通过pymysql连接MySQL&#xff0c;没有关闭连接的操作&#xff0c;所以短时间内不会出问题&#xff0c;长时间保持这个连接会出现连接混乱。虽然看着自己的代码没错&#xff0c;还是会报 pymysql.err.Inte…...

网站ar怎么做/怎样申请自己的电商平台

做过radiobutton的人都知道&#xff0c;它自带有图标&#xff0c;但是 俺上下键却没有出现选中的图标&#xff0c;我现在要实现这样的效果 下下键时 出现 radiobutton我不知道是如何实现的&#xff08;没找到&#xff0c;如果有知道的 请分享一下哈&#xff09; 我是采用listv…...