C++11内存对齐之std::aligned_storage与alignas与alignof

2023-11-10

1. std::aligned_storage

插播一下POD的含义:Plain old data structure,缩写为POD,是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中。POD通常被用在系统的边界处,即指不同系统之间只能以底层数据的形式进行交互,系统的高层逻辑不能互相兼容。比如当对象的字段值是从外部数据中构建时,系统还没有办法对对象进行语义检查和解释,这时就适用POD来存储数据。

可能的源码实现:

// PR c++/56859
// { dg-require-effective-target c++11 }
 
template<unsigned size, unsigned alignment>
struct aligned_storage
{
  using type = struct { alignas(alignment) unsigned char data[size]; };
};
template <unsigned Len, unsigned Align>
struct aligned_storage
{
    using type __attribute__((aligned((Align)))) =
        char[Len];
};
// PR c++/17743
 
template <unsigned Len, unsigned Align>
struct aligned_storage
{
  typedef char type[Len] __attribute__((aligned((Align))));
};

示例代码:

#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::launder
        return *reinterpret_cast<const T*>(data+pos);
    }
 
    // 从对齐存储删除对象
    ~static_vector() 
    {
        for(std::size_t pos = 0; pos < m_size; ++pos) {
            // 注意: C++17 起需要 std::launder
            reinterpret_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] << '\n' << v1[1] << '\n';
}

运行结果:


  
  
  1. *****
  2. **********

2. alignas

示例代码:

// sse_t 类型的每个对象将对齐到 16 字节边界
struct alignas(16) sse_t
{
  float sse_data[4];
};
 
// 数组 "cacheline" 将对齐到 128字节边界
alignas(128) char cacheline[128];
 
 
int main()
{
}

3. alignof

示例代码:

#include <iostream>
 
struct Foo {
    int   i;
    float f;
    char  c;
};
 
struct Empty {};
 
struct alignas(64) Empty64 {};
 
int main()
{
    std::cout << "Alignment of"  "\n"
        "- char             : " << alignof(char)    << "\n"
        "- pointer          : " << alignof(int*)    << "\n"
        "- class Foo        : " << alignof(Foo)     << "\n"
        "- empty class      : " << alignof(Empty)   << "\n"
        "- alignas(64) Empty: " << alignof(Empty64) << "\n";
}

运行结果:


  
  
  1. Alignment of
  2. - char  : 1
  3. - pointer  : 8
  4. - class Foo  : 4
  5. - empty class  : 1
  6. - alignas(64) Empty: 64

reference:

https://zh.cppreference.com/w/cpp/types/aligned_storage

https://zh.cppreference.com/w/cpp/language/alignas

https://zh.cppreference.com/w/cpp/language/alignof

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11内存对齐之std::aligned_storage与alignas与alignof 的相关文章

  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 在 C# 窗口应用程序中运行 C/C++ 控制台应用程序?

    现在 我想开发一个简单的应用程序 因此我决定最快的编码方式是 C NET 但现在 我很难实现我需要的功能之一 我想做的是在 C 应用程序的窗口内运行 C C 控制台应用程序 就像在虚幻前端中一样 添加一点通信方式 以便我可以为控制台应用程序
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • boost::spirit::qi::语法和可变参数模板

    我在使用可变参数模板定义语法时面临一个问题 我首先定义一些包含在某些结构中的简单语法 例如纬度 经度 如下所示 include
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include

随机推荐

  • 7、Shiro+SpringMVC+oracle+maven整合

    本章节主要介绍Shiro SpringMVC oracle maven整合 并实现shiro的身份验证和授权 建表并插入数据 1 用户表 CREATETABLEusers Table user id number 10 primarykey
  • leetcode-找出数组中的重复数字

    我们让最终的nums序列其索引号与数值相等 即0号索引位置上的数值是0 1号索引位置上的数值是1 当前nums i 没有放到正确的坑上 并且那个正确的坑上的数与那个坑是不匹配的 那么就要不停地交换 交换到不能交换的时候 就要判断一下 是不是
  • springboot毕设项目《C语言程序设计》题库管理系统39b5j(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目 C语言程序设计 题库管理系统39b5j java VUE Mybatis Maven Mysql 项目运行 环境配置 Jdk1 8 Tomcat8 5 Mysql HBuilderX Webstorm也行 Ec
  • C# 获取任务栏托盘通知区域中某个程序小图标位置

    一个小项目中需要用刀点击任务栏右下角通知区域的小图标 从而触发事件 其中比较容易出问题的地方是 public bool FindNotifyIcon IntPtr hTrayWnd ref Rect rectNotify UInt32 tr
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    学习目标 了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用
  • 安装liunx双系统总结

    安装liunx双系统总结 参考文章 安装liunx详尽文章 https www cnblogs com masbay p 10844857 html 首先将硬盘分好区 我是双硬盘 在win10安装的硬盘内 C盘里压缩出200MB的空间 另一
  • 真机安装Linux Centos7

    准备工具 8G左右U盘 最新版UltraISO CentOS7光盘镜像 操作步骤 下载镜像 地址 http isoredirect centos org centos 7 isos x86 64 安装刻录工具UltraISO 刻录镜像到U盘
  • (React入门)组件通信

    1 父组件向子组件通信 props 父组件直接通过props向子组件传递需要的信息 import React Component from react 子组件 class Child extends Component render con
  • 怎么搭建微服务架构?

    我要何时使用微服务架构 又如何将应用程序分解为微服务 分解后 要如何去搭建微服务架构 同时 在微服务架构中 因为会涉及到多个组件 那么这些组件又可以使用什么技术来实现呢 接下来的几个小节中 我们将对这些问题进行详细的讲解 微服务的拆分 对于
  • Jenkins

    Jenkins jenkins定义 jenkins功能 tomcat项目部署 jenkins安装 安装后的jenkins的配置 Jenkins jenkins定义 jenkins tomcat 部署 安装 jenkins 是一个开源软件项目
  • 栈的概念和基本使用

    栈 Stack 是一种线性序列结构 其操作仅限于逻辑上特定的一端 即新元素只能从栈的一端插入 也只能从栈的一端弹出 允许操作的一端叫做栈顶 禁止操作的一端叫做栈底 插入元素称为入栈 弹出元素称为出栈 栈中各个元素的操作次序遵循所谓的后进先出
  • 涅普2021训练营-MIsc(部分)

    bin txt 打开附件发现是一大串的二进制字符串 使用python直接转换成16进制 最好别用网页转换 字符串太长了 也不需要创建什么函数 直接进制转换 参考格式 hex int 字符串 2 将得到的16进制吗复制到文本 将0x删除后复制
  • git 服务端钩子做代码检查

    需求分析 在代码修改后可以对代码进行检查 比如代码规范检查 代码构建 单元测试等 我们需要禁止成员推送不符合规范的代码到服务端 Git 钩子能在特定的重要动作发生时触发自定义脚本 钩子分为客户端和服务器端两类 使用客服端钩子可以在commi
  • 字符游戏-智能蛇

    字符游戏 智能蛇 一 VT 100 终端标准 这里按照老师的课件要求 体验一下VT 100 输入输出功能以及清屏操作 代码直接复制课件中代码 这里就不再放一次了 直接给出运行效果 gcc sin demo c osin out lm sin
  • OpenAI开发系列(一):一文搞懂大模型、GPT、ChatGPT等AI概念

    全文共5000余字 预计阅读时间约10 20分钟 满满干货 建议收藏 本文目标 详细解释大型语言模型 LLM 和OpenAI的GPT系列的基本概念 一 什么是大模型 大型语言模型 也称大语言模型 大模型 Large Language Mod
  • 解决Centos7没有ens33

    进入centos7操作 ifconfig ens33 up systemctl stop NetworkManager systemctl disable NetworkManager ifup ens33 systemctl restar
  • explain查看索引使用

    CREATE TABLE test id int 11 NOT NULL name varchar 20 DEFAULT NULL dep id int 11 DEFAULT NULL age int 11 DEFAULT NULL tt
  • Qt中正确引用外部头文件和库文件的方法和注意点

    Qt中正确引入外部库文件的方法和注意点 一 什么报错是外部库导入错误导致的 二 解决外部库使用的方法 一 写入系统环境变量中的外部库调用 1 解释说明 2 使用演示 1 头文件 2 库文件 二 未写入系统环境变量中的外部库调用 1 解释说明
  • controller层

    前言 controller层代码主要流程都是 1 获取前端数据 运用request getParameter 数据名 2 创建user对象 用来传递参数 创建Service对象 用来使用Service服务的方法 3 调用Service的方法
  • C++11内存对齐之std::aligned_storage与alignas与alignof

    1 std aligned storage 插播一下POD的含义 Plain old data structure 缩写为POD 是C 语言的标准中定义的一类数据结构 POD适用于需要明确的数据底层操作的系统中 POD通常被用在系统的边界处