《深入理解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是一种经典的基于统计的方法,TF(Term frequency)是指一个单词在一个文档中出现的次数,通常一个单词在一个文档中出现的次数越多说明该词越重要。IDF(Inverse document frequency)是所有文档数比上出现某单词的个数,通常一个单词…...
web3 : blockscout剖析
Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。 目录 Blockscout可以做什么主要特征blockscoutDocker容器组件Postgres 1…...
【机器学习基础】DBSCAN
🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…...
计算机硬件 4.4键盘与鼠标
第四节 键盘与鼠标 一、认识键盘 1.地位:计算机系统最基本的输入设备。 2.外观结构:面板、键帽、底盘、数据线。 3.组成键区:主键区、功能键区、辅助键区和编辑(控制)键区。 二、键盘分类 1.按接口分 ①AT口&…...
Flappy Bird QDN PyTorch博客 - 代码解读
Flappy Bird QDN PyTorch博客 - 代码解读 介绍环境配置项目目录结构QDN算法重要函数解读preprocess(observation)DeepNetWork(nn.Module)BirdDQN类主程序部分 介绍 在本博客中,我们将介绍如何使用QDN(Quantile Dueling Network)算法…...
听GPT 讲Rust源代码--compiler(9)
File: rust/compiler/rustc_trait_selection/src/traits/select/mod.rs 在Rust源代码中,rust/compiler/rustc_trait_selection/src/traits/select/mod.rs文件的作用是实现Rust编译器的trait选择器。 首先,让我们逐个介绍这些struct的作用: Se…...
Go语言中关于go get, go install, go build, go run指令
go get go get 它会执行两个操作 第一个, 是先将远程的代码克隆到Go Path的 src 目录那二个, 是执行go install命令 那如果指定的包可以生成二进制文件那它就会把这个二进制文件保存到这个 Go Path 的bin目录下面这是 go install 命令执行的操作 如果只需要下载包,…...
石头剪刀布游戏 - 华为OD统一考试
OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 石头剪刀布游戏有 3 种出拳形状: 石头、剪刀、布。分别用字母 A,B,C 表示游戏规则: 出拳形状之间的胜负规则如下: A>B; B>C; C>A; 左边一个字母,表示相对优势形状。右边一个字母,表示相对劣势形状。…...
【北亚服务器数据恢复】ZFS文件系统服务器ZPOOL下线的数据恢复案例
服务器数据恢复环境: 服务器中有32块硬盘,组建了3组RAIDZ,部分磁盘作为热备盘。zfs文件系统。 服务器故障: 服务器运行中突然崩溃,排除断电、进水、异常操作等外部因素。工作人员将服务器重启后发现无法进入操作系统。…...
C# 反射的终点:Type,MethodInfo,PropertyInfo,ParameterInfo,Summry
文章目录 前言反射是什么?常用类型操作SummryPropertyInfoMethodInfo无参函数运行 有参函数运行,获取paramterInfo 总结 前言 我之前写了一篇Attribute特性的介绍,成功拿到了Attribute的属性,但是如果把Attribute玩的溜,那就要彻…...
2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序
2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现: 对于一些必须每天使用电脑工作的白领来说,电脑桌面有着非常特殊的意义,通常一些频繁使用或者比较重要的图标会一直保留在桌面上,但是随着时间的推移,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
