C++标准模板(STL)- 类型支持 (杂项变换,定义适于用作给定大小的类型的未初始化存储的类型,std::aligned_storage)

类型特性

类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。

试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。

定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
 

杂项变换

定义适于用作给定大小的类型的未初始化存储的类型

std::aligned_storage

template< std::size_t Len, std::size_t Align = /*default-alignment*/ >
struct aligned_storage;

(C++11 起)

提供嵌套类型 type ,其为平凡的标准布局类型,适于作为任何大小至多为 Len 且对齐要求为 Align 的因数的对象的未初始化存储。

Align 的默认值是任何大小至多为 Len 的对象的最强(最大)对齐要求。若不使用默认值,则 Align 对于某类型 T 必须为 alignof(T) 的值,否则行为未定义。

若 Len == 0 则行为未定义。

是否支持任何扩展对齐是实现定义的。

成员类型

名称定义
type长度至少为 Len 的 POD 类型,带对齐要求 Align

辅助类型

template< std::size_t Len, std::size_t Align = /*default-alignment*/ >
using aligned_storage_t = typename aligned_storage<Len, Align>::type;

(C++14 起)

注意

std::aligned_storage<>::type 所定义的类型能用于创建适合保有给定类型对象的未初始化内存块,可选地对齐严格于其自然对齐要求,例如在缓存或页边界上。

同任何其他未初始化存储,对象通过使用布置 new 创建,并以显式的析构函数调用销毁。

可能的实现

除了默认实参, aligned_storage 能通过 alignas 表达:

template<std::size_t Len, std::size_t Align /* 未实现默认对齐 */>
struct aligned_storage {struct type {alignas(Align) unsigned char data[Len];};
};

调用示例

#include <iostream>
#include <type_traits>
#include <string>template<class T, std::size_t N>
class static_vector
{// N 个 T 的正确对齐的未初始化存储typename std::aligned_storage<sizeof(T), alignof(T)>::type data[N];std::size_t m_size = 0;public:// 于对齐存储创建对象template<typename ...Args> void emplace_back(Args&&... args){if (m_size >= N)  // 可行的错误处理throw std::bad_alloc{};new (data + m_size) T(std::forward<Args>(args)...);++m_size;}// 访问对齐存储中的对象const T& operator[](std::size_t pos) const{// 注意: C++17 起需要 std::launderreturn *reinterpret_cast<const T*>(data + pos);}// 从对齐存储删除对象~static_vector(){for (std::size_t pos = 0; pos < m_size; ++pos){// 注意: C++17 起需要 std::launderreinterpret_cast<T*>(data + pos)->~T();}}
};int main()
{static_vector<std::string, 10> v1;v1.emplace_back(5, '*');v1.emplace_back(10, '*');std::cout << v1[0] << std::endl << v1[1] << std::endl;return 0;
}

输出

*****
**********

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录5款NodeJS后端框架

文章目录 前言一、Express二、Nest.js三、Meteor四、Koa.js五、Fastify 前言 https://xie.infoq.cn/article/d8c2cd9cb99a04cbbf0a45434 https://juejin.cn/post/6959583458779725860 Nodejs 框架分为三种类型&#xff1a; MVCREST APIFull-Stack 一、Express Express 是最…

uni-app 微信小程序 电子签名及签名图片翻转显示功能

文章目录 1. 需求背景2. 开始撸2.1 点击 重写 进入签名页面&#xff08;上图一&#xff09;2.2 书写签名&#xff0c;点击确认返回&#xff0c;及图片翻转显示&#xff08;上图二&#xff0c;三&#xff09; 3. 图片进行翻转&#xff0c;返回翻转后的图片 1. 需求背景 接的一个…

Hdoop学习笔记(HDP)-Part.6 安装OracleJDK

六、安装OracleJDK 下载jdk安装文件&#xff0c;放到/opt中&#xff0c;将文件解压到/usr/local下后&#xff0c;修改/etc/profile文件中环境参数&#xff0c;实现java的安装。 创建jdk.yml文件 ---- hosts: alltasks:- name: copy and unzip jdkunarchive:src: "/opt/j…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…

深入解析SpringBoot的请求响应机制

SpringBootWeb请求响应 前言1. 请求1.1 Postman介绍 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2. 响应2.1 Response…

电子学会C/C++编程等级考试2021年06月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字三角形问题 (图1) 图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注意:路径上的每一步只能从一个数走到下一层上和它…

【微服务 SpringCloudAlibaba】实用篇 · Gateway服务网关

微服务&#xff08;8&#xff09; 文章目录 微服务&#xff08;8&#xff09;1. 为什么需要网关2. gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的…

LeetCode22. 括号生成

参考的题解 &#x1f517;:链接22. 括号生成 class Solution {public List<String> generateParenthesis(int n) {List<String> result new ArrayList<>();backtracking(n, result, 0, 0, "");return result;}private void backtracking(int n, …

python之logo编程

Logo标志是一种视觉符号&#xff0c;代表着一个品牌、企业或组织的形象。它通常采用图形、字母或字形来代表一个公司或品牌&#xff0c;起到对徽标拥有公司的识别和推广的作用。Logo的设计需要考虑多种因素&#xff0c;例如颜色搭配、字体选择和构图等&#xff0c;以创造出独特…

java餐饮刀削面快餐店点餐服务系统springboot+jsp

网上点餐省去了客户很多不必要的时间和麻烦&#xff0c;给商家带来更多利益。同时&#xff0c;网上点餐可以辅助餐饮企业营销。传统的点餐是需要配备一个专业的服务员负责菜品介绍并记录顾客点单&#xff0c;确认后上交至后台厨房&#xff0c;厨房根据菜品种类安排做菜顺序最终…

11.28 C++作业

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" <<…

前端面试灵魂提问-计网(2)

1、websocket 为什么全双工? 1.1 WebSocket是什么 WebSocket 是一种通信协议&#xff0c;它在客户端和服务器之间建立持久的全双工连接。全双工意味着数据可以双向流动&#xff0c;即客户端可以向服务器发送消息&#xff0c;服务器也可以向客户端发送消息&#xff0c;而无需…

Hertz 整合swagger

文章目录 Swagger安装使用用法项目demoSwagger注释用法通用API信息 swag命令行参数swagger路由配置 Swagger 安装 go get 安装可执行文件需要配合 GOPATH 模式工作。 go get github.com/swaggo/swag/cmd/swag 因为从 Go 1.17 开始&#xff0c;在 go mod 模式下通过 go get 下…

Go 语言中 sync 包的近距离观察

让我们来看看负责提供同步原语的 Go 包&#xff1a;sync。 sync.Mutex sync.Mutex 可能是 sync 包中被广泛使用的原语。它允许对共享资源进行互斥操作&#xff08;即不允许同时访问&#xff09;&#xff1a; mutex : &sync.Mutex{}mutex.Lock() // Update shared variab…

Jinja2使用Layui报 “d is not defined“

问题出现场景在使用Jinja2渲染Layui的表格时候&#xff0c;要做自定义templte的传入 Jinja2这块本来就是支持 {{ }} 插值的模板语言&#xff0c;所以这块的第一种渲染方式会冲突 所以只能用函数返回代码块进行填充&#xff0c;不能使用插值&#xff0c;只能拼接字符串 templt…

Gradle windows下配置

1.Gradle下载 打开官网下载界面&#xff1a;https://gradle.org/releases/ 如果你使用的SpringBoot项目&#xff0c;建议使用6.8及以上的版本 2.下载后放到目录下 3.配置环境变量 配置gradle_home 配置Path 4.配置成功 5.配置国内源 新建一个init.gradle文件&#xff0c;配…

MySQL- CRUD-单表查询

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

虚假IP地址攻击的溯源方法

随着网络技术的迅速发展&#xff0c;网络攻击行为也日益猖獗。其中&#xff0c;虚假IP地址攻击是一种较为常见的网络攻击方式&#xff0c;它利用虚假的IP地址&#xff0c;通过互联网对目标进行攻击和入侵。这种攻击方式不仅难以追踪&#xff0c;而且往往会给企业和个人带来巨大…

Java的运算符

Java的运算符主要分为以下几类&#xff1a;算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符和条件运算符。 一、算术运算符 算术运算符主要用于执行数值计算&#xff0c;包括加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff0…

在安全环境中使用虚拟化进行隔离——Armv8.4上的安全世界软件架构

目录 一、简介 二、背景-Arm TrustZone™技术的简要历史 三、当今安全世界的挑战 3.1. 可信应用生态系统的挑战 3.2. 在安全世界集成来自多个供应商的代码 3.3. 最小权限原则