学习笔记:alignas用法

C/C++ 字节对齐alignas()的使用 阅读详情
struct Test{
    char arr[9];
    alignas(16) int a;
    double b;
    char c;
};

int main()
{
    auto sizeof_test = sizeof(Test);
    auto alignof_test = alignof(Test);

    auto offsetof_a=offsetof(Test,a);
    auto offsetof_b=offsetof(Test,b);
    auto offsetof_c=offsetof(Test,c);

    return 0;

}

问题1) 什么是对齐。
举例说明,某个int类型的对象,要求其存储地址的特征是4的整倍数。例如0x0000CC04。我们把地址值0x0000CC04除以4,余数0,那么这个对象的地址就是对齐的。

问题2) 为什么要对齐。
举例说明,对于int数据,硬件只能在4的倍数的地址读写,假设某int对象的地址是0x0000CC06,则硬件先读取0x0000CC04开始的4个字节,
取其0x0000CC06, 0x0000CC07。硬件然后读取0x0000CC08开始的4个字节,取其0x0000CC08, 0x0000CC09。将两次读取的有用信息拼接即可。
显然,效率不高。更严重的,硬件会报错,程序执行不下去。


问题3) x86体系下,用#pragma pack(1) 改变结构体中int成员的对齐属性,也没报错呀
只能说x86容忍性高,程序正常跑,不见得效率没有降低。


问题4) C++11的alignas是什么。

改变一个数据类型的对齐属性。在例子中,Test::a的对齐值变成16,意味着a的地址值必须能被16整除。
考察a的偏移值是16,意味着arr[9]后面被插入填充用的7个字节了。


问题5) 上例中,只是a相对结构体首地址的偏移值16,如果结构体首地址的值是0x0000CC01,然后+16 = 0x0000CC11,显然不满足地址值的16倍数对齐了
在哪里创建Test当然是很重要的,为了防止上述事件发生,需要编译器和程序员的共同努力,但主要担子还在编译器上。例如在函数栈上创建一个Test对象,编译器必须选择一个好地方才行。

问题6) 为什么sizeof(Test)是48
offsetof(a)=16,a本身长4字节,b的偏移本应是20。
但是考虑到b的类型是double,其默认对齐值是8。20不是8的倍数,填充4个垃圾字节,现在到达偏移值24。
所以b的真正偏移值是24,b占8个字节。
现在到达c,c的偏移值是32,c本身占1个字节,整个test的长度貌似是33。
可是你要考虑test数组,例如数组test kk[2]。kk[1].a, 相对于数组首地址的偏移为33+16=49。这个地址不满足a的对齐了。

但是在c的后面填充15个垃圾字节,则 kk[1].a的地址 =  kk的首地址值 + kk[0]长度48 + kk[1].a偏移值16

假设编译器把kk的首地址值放置的位置使:   
kk的首地址值  /  16 = 0
kk[0]长度48 / 16 = 0
kk[1].a偏移值16 / 16 = 0
则  kk[1].a的地址 / 16 = 0

问题7) 为什么alignof(Test)是16
由于对齐值只能是2,4,8等2的幂,所以大的对齐值一定满足小的对齐需求。例如我按照16字节对齐了,当然也满足8字节对齐,4自己对齐,2字节对齐,1字节对齐了。
整个结构体的对齐值,就是各成员对齐值,最大的那个。

问题8)alignas(2) int a;  可以实现吗?
C++11规定,只能放大对齐值,而int的原始对齐值是4,现在你要求按2对齐,编译器会忽略你的请求。


struct alignas(64) Test{
    //virtual ~Test(){}
    char arr[9];
    alignas(16) int a;
    double b;
    char c;
};
问题9) 现在的test对齐值是多少?
要求Test的地址能被64整除,那么Test本初的原始对齐值16,被弃用,使用更大的对齐值64。

问题10) 现在的test大小是多少?
Test的大小是64,增加了更多的填充垃圾字节,以适应64倍数地址值。

问题11) C++11为什么增加这个机制,让程序员控制对齐方式。
1是现有编译器都有语言扩展,例如__declspec(align(n))等,急待统一。
2是现实需求,例如利用placement new语法创建对象,如果你随便提供的内存块同T类型的对齐要求不一致,就是有副作用。
3是语言本身完善的必然,缺了这个东西,C++就不是完备的。C++是如此学院派,价值取向就是相容,独立,完备。





C++11新增关键字~alignas(struct对齐、sizeof、alignof) 本文记录alignas关键字,同时介绍alignof和sizeof. 阅读详情

相关推荐

C++ 内存对齐:alignas 与 alignof

内存对齐是指数据在内存中按照特定的字节边界存储。一般情况下,处理器从内存读取数据时会更高效地读取对齐的数据。如果数据未对齐,处理器可能需要进行额外的内存访问,导致性能下降。对于某些平台,不对齐的内存访问甚至可能引发未定义行为。通常,C++ 编译器会根据目标平台自动对变量进行内存对齐,确保类型的内存地址是适当的对齐边界。但有时,开发者需要对内存对齐进行精确控制,比如优化性能、与硬件设备交互等场景,这就是alignas和alignof的用武之地。

T 2446

C++11alignas 说明符和alignof 运算符和内存对齐问题

alignas()alignas()alignas(...)1) 表达式 必须是求值为零或合法的或扩展对齐的。2) 等价于 alignas(alignof(类型标识))3) 等价于对同一说明应用多个 alignas 说明符,逐个对应于的各个成员,形参包可以是类型或非类型形参包。

a4364634611的博客 1691

C++中的内存对齐问题:alignof和alignas的用法

C++中的内存对齐问题,alignof和alignas的用法讲解。

fangfanglovezhou的博客 2238

alignas的使用C语言,内存对齐:如何使用alignof / alignas?

对齐方式是可以存储值的第一个字节的存储位置的限制。 (需要提高处理器的性能,并允许使用某些仅适用于具有特定对齐方式的数据的指令,例如,SSE需要对齐为16个字节,而AVX必须对齐为32个字节。)对齐16表示唯一的有效地址是16的倍数的内存地址。alignas强制对齐到所需的字节数(cppreference没有提及,但是我认为您只能对齐2、1、2、4、8、16、32、64、128等的幂)#inclu...

weixin_39600885的博客 741

老司机避坑指南:UC3842自举驱动电路发热严重?这样选C39/C37电容值最稳

本文针对UC3842自举驱动电路发热严重的问题,深入剖析了驱动波形边沿速度与损耗的矛盾根源。通过实测数据与热成像分析,重点阐述了关键电容C39/C37的选型策略,提供了从经验公式到量化计算的优化方法,帮助工程师在发热与效率间找到最佳平衡点,并探讨了分立方案与专用驱动IC的适用场景。

lambda的博客 747

JESD204B Subclass 1的SYSREF机制

SYSREF 是一个系统级同步脉冲信号,用于对齐 JESD204B 中的 LMFC(Local Multi-Frame Clock),从而实现每次建链的延迟一致性。核心点内容说明是系统参考跨多个芯片、多通道实现精确同步控制 LMFC决定所有设备的 LMFC 对齐点仅用于 Subclass 1是 JESD204B 实现确定性延迟的前提条件一般通过时钟芯片生成推荐使用 AD9528、LMK04828,支持 JESD204 专用输出建链过程中关键作用。

weixin_41230430的博客 1832

C/C++ 结构体、类的内存对齐规则,以及#pragma pack、alignas、alignof的用法。

接下来在64位系统中、编译器默认的对齐字节。

weixin_44078346的博客 1826

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5868

alignas解析

不能小于类型的自然对齐(可通过 alignof 查询),可叠加使用(取最大值)。它是C++11引入的对齐说明符(Alignment Specifier,允许显式指定变量或类型的对齐要求。作用:提高内存访问效率(硬件可能无法读取未对齐的数据)或满足硬件强制要求(如SIMD指令)。static_assert(alignof(Example) == 8, "对齐失败");3 实际对齐值取 alignas指定值和类型自然对齐的最大值。语法格式:alignas(N) 或 alignas(类型)。

kupePoem的专栏 569

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv)

本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。

weixin_29063979的博客 147

51单片机+HX711电子秤Proteus仿真保姆级教程(附完整源码与避坑指南)

本文详细介绍了51单片机与HX711电子秤在Proteus仿真中的全流程实战指南,包括电路设计、核心代码实现、典型问题排查及系统集成等关键步骤。特别提供了HX711驱动程序的编写技巧和称重数据处理算法,帮助开发者快速搭建高精度电子秤仿真系统,并避免常见的设计陷阱。

weixin_30752699的博客 414

C++内存对齐实战:alignas在结构体中的8种用法与避坑指南

内存对齐是现代CPU架构为提升数据存取效率而制定的核心规则,它要求数据对象的起始地址满足特定倍数关系。其原理在于,CPU访问未对齐内存可能导致总线错误或性能惩罚。掌握内存对齐技术对于实现高性能计算、硬件交互和网络协议解析等场景至关重要。C++11标准引入的alignas关键字,为程序员提供了标准化的工具来精确控制内存布局,从而优化程序性能并确保数据正确性。本文聚焦于alignas在结构体中的实战应用,深入剖析了包括避免伪共享、SIMD优化、内存池设计及硬件协议匹配在内的8种典型场景,并系统总结了动态内存分配

weixin_33853827的博客 399

Fedora 41上安装钉钉7.6.25,我踩过的那些依赖坑和最终解决方案

本文详细记录了在Fedora 41上安装钉钉7.6.25版本的全过程,包括解决依赖问题、转换deb包为rpm格式、处理libm.so.6错误等关键步骤。通过分享这些实用技巧和最终解决方案,帮助Linux用户顺利在Fedora系统上运行钉钉客户端,提升工作效率。

weixin_30485379的博客 206

C++11 中的内存对齐:alignas 与 alignof

*alignas**:用于显式设置类型或对象的对齐方式。**alignof**:用于查询类型或对象的对齐要求。内存对齐:是硬件、性能优化和正确性保证的重要机制,合理的对齐方式有助于提高程序性能。alignas可以帮助程序员在需要特殊对齐的场合手动指定对齐方式,而alignof则提供了一种机制来检查编译器为类型选择的对齐方式。

AI_aidushu的博客 595

osgEarth加载大疆数据

【代码】osgEarth加载大疆数据。

weixin_44769745的博客 308

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 489

alignas的使用C语言,alignas

alignas作为类型说明符之一出现在声明语法中,以修改所声明对象的对齐要求。句法_Alignas ( expression )(1)(since C11)_Alignas ( type )(2)(since C11)expression-any integer constant expression whose value is a valid alignment or zerotype-any...

weixin_30458701的博客 3814

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

一次内存对齐的深入探索:C++ alignas 的学习与实践

前阵子在折腾一个多线程数据处理的小项目,遇到了一个诡异的性能问题——两个线程各自累加一个计数器,按理说应该线性加速,结果开了两个线程比单线程还慢。两个计数器被放在了同一个缓存行里,线程A修改自己的计数器时,会把整个缓存行锁住,导致线程B的缓存失效,来回颠簸。如果你也在找免费的服务器资源练手,可以试试阿贝云 https://www.abeiyun.com ,对学生党和个人开发者挺友好的。是 C++11 引入的一个关键字,用来显式指定类型或对象在内存中的对齐要求。修饰栈上的变量或结构体成员是没问题的,但。

2601_95983539的博客 195

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C++】alignas和alignof的用法

alignas是 C++11 引入的一个关键字,用于指定类型或变量的对齐方式(alignment)。对齐是指内存中的数据如何排列,对齐方式可以影响性能和内存使用。使用alignas可以显式地指定一个类型或变量的对齐要求。对齐要求通常以字节为单位。以下是alignas。

Yinrtyu_的博客 497

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++11内存对齐精讲:alignas在结构体中的8种典型用法与避坑指南

掌握C++11内存对齐技巧,解决结构体跨平台对齐难题。通过alignas的结构体对齐示例,详解8种典型用法与常见陷阱,涵盖性能优化、内存布局控制等关键场景,提升程序效率与可移植性,值得收藏。

ProceGlow的博客 997

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

1. std::aligned_storage 可能的源码实现: // PR c++/56859 // { dg-require-effective-target c++11 } template<unsigned size, unsigned alignment> struct aligned_storage { using type = struct { align...

Enjoy Coding 8732

alignof 和 alignas各版本异同

本节学习 alignof 与 alignas 在各版本的异同,后续请关注,将持续更新~~

qq_36606147的博客 816

C++11的alignof和alignas

C++11的alignof和alignas

iaibeyond的专栏 3074

避免跨平台崩溃的关键:,alignas在结构体对齐中的4种高阶用法

解决跨平台内存对齐问题,深入解析C++ alignas 的结构体对齐。涵盖SIMD优化、硬件映射、联合体对齐与跨编译器兼容4种高阶用法,提升性能与稳定性,避免数据错位崩溃,值得收藏。

PixelWander的博客 320

C++ alignof和alignas

一、什么是alignof和alignas alignas用来指定对象的对齐字节数。效果和__attribute__((aligned(n)))一样 alignof用来查看对象的对齐字节数。用法类似于sizeof 二、实验 使用alignas修改结构体的对齐字节数,然后用alignof查看是否设置成功。 同时,与__attribute__((aligned(n))) 进行对比。 #include <iostream> using namespace std; struct alignas(1)

weixin_38956024的博客 1972

揭秘alignas结构体对齐:如何精准控制内存布局提升性能

掌握alignas的结构体对齐技巧,有效优化内存布局与访问性能。通过典型alignas的结构体对齐示例,解析高性能计算与嵌入式开发中的内存对齐方法,提升数据存取效率,减少填充浪费。适用于追求极致性能的C++开发者,值得收藏。

InstrWander的博客 375
上一篇: 学习笔记:外部模板的应用
下一篇: 学习笔记:default, delete关键字
audi2
博客等级 码龄18年 11粉丝 118原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值