Linux __attribute__((aligned(n)))和#pragma pack

【嵌入式底层知识修炼】结构体成员对齐之#pragma pack(n)和__attribute__((aligned (n)))的含义和区别 文章目录01 - 提出问题02 - 对齐规则2.1 - 自然对齐规则2.2 - 自定义对齐之#pragma pack(n)2.3 - 自定义对齐之__attribute__((aligned (n)))2.4 - 两种自定义对齐方式的区别03 - 解答问题04 - 问题扩展05 - 总结 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 ————优快云赵4老师  ... 阅读详情

字节对齐

1. 什么是字节对齐

  在C语言中,数据结构是一种复合的数据类型,其构成元素既可以是基本的数据类型(例如,int、long、char、bool等)的变量,也可以是复合数据类型(例如,数组、链表、数据结构等)的数据单元。在数据结构中,编译器为其每个成员按照正常边界进行空间分配。各个成员按照它们被声明的顺序在内存中进行存储,第一个成员的地址和整个数据结构的地址相同。
  为了是CPU能够对变量进行快速的访问,变量的起始地址具有某些特性,即字节对齐。例如int,其字节长度为4字节,那么它的起始地址应该位于4字节倍数的起始地址上。

2. 字节对齐作用

  1) 字节对齐有利于cpu的快速访问;
  2) 合理利用字节对齐可以有效的节省存储空间。

C语言中字节对齐

1. __attribute__关键字

   __attribute__: 关键字__attribute__允许在定义struct、union等类型时,指定特殊属性。此关键字后面是跟双括号来进行属性说明的。__attribute__不属于标准C语言,它是GCC对C语言的扩展用法。
   __attribute__((aligned(n))): 指定了指定类型的变量的最小对齐(以字节为单位)。若数据结构中有成员的长度大于n,测按照最大成员的长度对齐。注意: 对齐属性的有效性守卫链接器(linker)限制,若链接器不支持16字节对齐,那么当配置16字节对齐的时候,它也仅仅提供链接器所支持的对齐方式。
   __attribute__((packed)): 取消编译过程中的优化对齐。

2. pragma pack

  使用伪指令#pragma pack(n),进行字节对齐,C编译器将按照n个字节进行对齐;
  使用伪指令#pragma pack(),取消自定义字节对齐,采用自然边界条件分配空间的方式。

代码案例

#include <iostream>

using namespace std;

//#define MY_ALIGNED(n) __attribute__((aligned(n)))
#define MY_ALIGNED(n) __attribute__((aligned(n)))
#define MY_ALIGNED1  MY_ALIGNED(1)
#define MY_ALIGNED4  MY_ALIGNED(4)
#define MY_ALIGNED8  MY_ALIGNED(8)
#define MY_ALIGNED16 MY_ALIGNED(16)
#define MY_ALIGNED32 MY_ALIGNED(32)
#define MY_ALIGNED64 MY_ALIGNED(64)

//using __attribute__((aligned(8))) my_int32 = int;
typedef int my_int32 __attribute__((aligned(16)));

typedef struct {
    char a;
    float b;
    short c;
} S;
typedef struct MY_ALIGNED1 {
    char a;
    float b;
    short c;
} S_1;
typedef struct MY_ALIGNED4 {
    char a;
    float b;
    short c;
} S_4;
typedef struct MY_ALIGNED8 {
    char a;
    float b;
    //short c;
} S_8;
typedef struct MY_ALIGNED16 {
    char a;
    float b;
    short c;
}S_16;
typedef struct MY_ALIGNED32 {
    char a;
    float b;
    short c;
} S_32;
typedef struct MY_ALIGNED64 {
    char a;
    float b;
    short c;
} S_64;
#pragma pack(1)
typedef struct {
    char a;
    float b;
    short c;
} S_pack_1;
#pragma pack()
#pragma pack(2)
typedef struct {
    char a;
    float b;
    short c;
} S_pack_2;
#pragma pack()


int main(int argc, char** argv){

    cout << "S: " << sizeof(S) << endl;
    cout << "S_1: " << sizeof(S_1) << endl;
    cout << "S_4: " << sizeof(S_4) << endl;
    cout << "S_8: " << sizeof(S_8) << endl;
    cout << "S_16: " << sizeof(S_16) << endl;
    cout << "S_32: " << sizeof(S_32) << endl;
    cout << "S_64: " << sizeof(S_64) << endl;
    cout << "S_pack_1: " << sizeof(S_pack_1) << endl;
    cout << "S_pack_2: " << sizeof(S_pack_2) << endl;
    // alignof,查询数据结构对齐要求
    cout << "aligned: " << alignof(int) << ", my_int32: " << alignof(my_int32) << endl;
    return 0;
}


// 输出结果:
S: 12
S_1: 12
S_4: 12
S_8: 8
S_16: 16
S_32: 32
S_64: 64
S_pack_1: 7
S_pack_2: 8
aligned: 4, my_int32: 16

__attribute__扩展

 __attribute__机制是GNU C的一大特色,可用于设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

1. 函数属性

 函数属性参数有: aligned、alloc_size、noreturn、return_twice、(noline, noclone)、always_inline、flatten、pure、const、nothrow、sentinel、format、format_arg、no_instrument_function、(no_split_stack, section)、(constructor, destructor)、used、unused、deprecated、weak、malloc、alias、ifunc、warn_unused_result、nonnull、gnu_inline、externally_visible、hot、cold、artificial、error、warning…

2. 变量属性

 变量属性参数有: aligned、cleanup、common、nocommon、deprecated、mode、packed、section、shared、tls_model、unused、used、vector_size、selectany、weak、dllimport、dllexport…

3. 类型属性

 类型属性参数有: aligned
packed、transparent_union unused、deprecated、visibility、may_alias…

Linux内核:内存管理——内存对齐 计算机中内存空间是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是:在访问特定类型变量的时候通常在特定的内存地址访问,这就需要对这些数据在内存中存放的位置有限制,各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。内存对齐是编译器的管辖范围。表现为:编译器为程序中的每个“数据单元”安排在适当的位置上。其实,内存对齐就是定制了一套规则,以合理的利用内存空间并提高内存访问效率。 阅读详情

相关推荐

C语言内存对齐与#pragma pack(1)实战:原理、应用与陷阱

内存对齐是计算机系统中一项基础且关键的技术概念,它源于现代处理器架构的硬件特性,要求数据在内存中的起始地址最好是自身大小的整数倍。这一机制通过牺牲少量内存空间,换取内存访问效率的显著提升,避免了非对齐访问可能引发的性能损失或硬件异常。在底层开发、嵌入式系统及网络通信等高阶工程实践中,内存对齐直接影响数据存储与传输的准确性。然而,当涉及网络协议解析、跨平台数据交换或内存敏感型应用时,默认的对齐规则可能引入冗余填充字节,导致数据错位。此时,开发者需要借助编译器指令如 #pragma pack(1) 来精确控制结

weixin_30321449的博客 556

C语言嵌入式Linux编程第5期:C标准及GNU C扩展

本课程是《C语言嵌入式Linux编程》第5期主要内容包括:Linux内核、驱动程序中,GNU C对标准C扩展的大量的语法。学员在掌握这些扩展语法的基础上,消除阅读Linux内核、驱动、GNU开源软件的障碍。能够看懂这些“稀奇古怪”的语法,学会用这些扩展的语法知识去分析复杂的开源软件、Linux内核及驱动代码。

GCC/Clang __attribute__ 详解:内存对齐、性能优化与嵌入式开发实战

在C/C++系统编程中,编译器优化与内存布局控制是提升程序性能与稳定性的关键技术。通过编译器指令,开发者可以精细指导代码生成过程,例如指定数据结构的内存对齐方式以适配硬件访问特性,或为函数添加优化提示以提升执行效率。这些技术在高性能计算、嵌入式系统及底层驱动开发中具有重要价值,能够有效解决缓存伪共享、非对齐访问崩溃等实际问题。本文以GCC/Clang的__attribute__扩展为核心,深入解析aligned、packed、hot、section等关键属性的工作原理,并结合内存池设计、固件模块化等实战场景

weixin_33851429的博客 399

【高级C】__attribute__((aligned(n))) 与 #pragma(pack(n))的区别

文章目录__attribute__((aligned(n))) 与 #pragma(pack(n))的区别一、正确理解__attribute__((aligned(x)))二、正确理解 #pragma(pack(n))三、详解开篇例题3.1 例题一解答3.2 例题二解答3.3 例题三解答四、注意__attribute__ ((aligned (n)))的位置 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客

从善若水的博客 2798

GCC/Clang/MSVC 3 大编译器结构体对齐实测:pragma pack 与默认值差异分析

本文深入分析了GCC、Clang和MSVC三大编译器在结构体对齐方面的差异,通过实测数据揭示了默认对齐值和#pragma pack指令的跨平台陷阱。重点关注字节对齐对性能和兼容性的影响,为跨平台开发提供实用建议和最佳实践,帮助开发者避免常见的内存对齐问题。

weixin_30776545的博客 393

SAP MTO模式实战:从库存管理到成本核算的深度解析

本文深入解析SAP MTO(Make-to-Order)模式在制造业中的应用,从库存管理到成本核算的全流程实战技巧。通过对比MTS模式,详细阐述MTO的核心逻辑、库存管理配置、成本核算路径及与PP模块的集成要点,帮助企业实现按单生产的高效管理,优化库存水平和资金占用。

weixin_29204205的博客 709

__attribute__((aligned())) 和#pragma pack(1)

typedef struct Student_t { int age; char c; }__attribute__((aligned (64))) Student; //影响结构体自身的对齐和大小,每个结构体单独占用64字节 ,不影响其中结构体中元素的对齐 typedef struct Node_t { int a; char c; } Node __attribute__((a...

weixin_38812277的博客 1925

ESP32连接PDM麦克风操作指南:新手入门必看

手把手教你如何将ESP32与PDM麦克风连接,采集音频数据并用于音频分类应用。内容涵盖硬件接线、代码配置及实际调试技巧,适合初学者快速上手esp32在声音识别场景中的使用。

weixin_42590539的博客 1329

aligned内存对齐

__attribute__((aligned(n)))内存对齐 使用环境Linux version 4.15.0-29-generic (buildd@lgw01-amd64-057) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) 关于设置内存对齐方式上有两种方式: __attribute__((aligned(n)))编译器按照n个字节对齐 #pragma pack(n) 编译器将按照n个字节对齐;#pragma pack () 取消指定对齐,恢复缺省对齐

weixin_48617416的博客 818

Multisim 11.0的安装破解汉化步骤

15:打开注册机,选择管理员运行,默认第一项,选择生成文件路径,这里不要随意选择,要找到你安装Multisim安装路径下Shard下的License Manager路径下,否则会报错,破解失败。14:后面会出现一个更新提示,选择否,然后选择重启电脑后,先不要选择重启电脑,在这里出现了问题(可能敲击回车,默认去重启电脑了),所以我说不要重启电脑,重启破解时右下角出现这,点击否。17:重启电脑,如果前面重启过,那可以跳过重启,应用程序下找到下图所示,启动。16:点击确认覆盖,路径下生成了该文件。

qq_53260940的博客 2371

ABB机器人绝对精度实战:从焊接路径优化到TCP控制(附配置步骤)

本文深入探讨了ABB机器人绝对精度在焊接路径优化中的核心价值。通过对比重复定位精度,阐明绝对精度如何补偿机械误差,确保TCP在整个运动路径上的轨迹精度。文章提供了从示教器激活绝对精度功能的详细配置步骤,并分享了针对焊接抖动和实现0.2mm路径精度的进阶调优技巧,包括TCP标定、伺服参数优化与系统维护。

weixin_29053073的博客 351

c语言 linux sd_嵌入式Linux C语言(六)——内存字节对齐

嵌入式Linux C语言(六)——内存字节对齐一、内存字节对齐简介1、内存字节对齐计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐。2、内存字节对齐原因不同硬件平台对存储空间的处理是不同的。一些平台对某些...

weixin_39534100的博客 259

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 673

C 语言的骚操作

我开始也是怀疑这个是不是能够运行起来,就写了一段测试程序。代码语言:cAI代码解释上述代码只要熟悉 c 语言的基本都能看得懂,对代码进行编译时候编译也通过了。编译代码编译器只是对编译过程做出了警告,并没有报 error ,所以语法层面是可以编译成功的。那么既然可以运行那么有人直到结果是什么吗?在得出结果前,我们先看一下这段代码是干什么的,首先(Test)0 是将 0 强制转化为一个指向 test 结构体的指针。

2509_93923260的博客 541

Cloud Connector RFC 访问控制深度实践:为 SAP BTP ABAP environment 打通安全、可控的远程连接

本文是一份面向企业ABAP团队与平台工程团队的Cloud Connector RFC访问控制配置指南。文章详细介绍了虚拟主机/实例号、负载均衡、资源白名单等核心概念,并提供了从零开始的配置流程。主要内容包括:通过Cloud Connector建立安全隧道的价值(零暴露、最小权限)、两种连接类型(无负载均衡/带负载均衡)的配置方法、资源白名单设置技巧,以及两个典型应用场景(Custom Code Migration远程检查与BAPI调用)的实操案例。指南基于SAP官方文档,包含落地经验与避坑建议,可帮助团队快

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 146

【CloudCompare】Windows源码编译CloudCompare

本文详细介绍了在Windows环境下编译安装CloudCompare V2.12.0的过程。首先配置了PCL 1.14.1、CMake 3.30.6和QT 5.14.2开发环境,使用Visual Studio 2022工具集。然后下载源码并通过CMake进行配置,特别注意勾选PLUGIN_STANDARD_QPCL以支持PCD文件加载。最后在VS2022中编译安装,并指出Debug模式下可能遇到的VTK库后缀问题,需添加CMAKE_DEBUG_POSTFIX变量解决。整个流程涵盖了从环境搭建到最终编译成功的

yijiujiusan的博客 486

深入理解#pragma pack:内存对齐原理、应用场景与跨平台实践

内存对齐是计算机系统中提升数据访问效率与保证程序正确性的基础机制。其原理源于CPU以固定字长(如4字节、8字节)访问内存,非对齐访问可能导致性能下降甚至硬件异常。编译器默认会插入填充字节以实现对齐,但这可能造成内存浪费。在嵌入式开发、网络通信等场景中,精确控制内存布局至关重要。通过#pragma pack指令,开发者可以指定结构体成员的对齐边界,从而匹配硬件寄存器或协议定义的二进制格式。本文结合网络协议栈、硬件寄存器映射等热词,解析如何利用这一特性优化内存使用并规避跨平台陷阱,为编写高效、健壮的系统级代码提

weixin_34226706的博客 6963

老电脑续命神器:Windows 11 26H1 精简游戏版,帧率稳定无压力!(Win11 26H1 极致精简游戏版(3.17G):装完只占 8G 内存,Ultra CPU 性能拉满)

旧电脑福音也能安装windows11畅玩游戏🎮:文章分享一款 Windows 11 26H1 精简游戏版,仅 3.17G、C 盘占用 8G,开机进程约 50 个,内存占用 1.4G,内置游戏优化与运行库,支持离线安装、跳过 TPM 检测,让老电脑也能畅玩 3A 游戏和办公娱乐 🚀。

XiaoqiangClub的博客 1061

linux对齐指令,C语言之GCC中支持的内存对齐指令

1:gcc中支持但不推荐使用的指令#pragma pack() :取消内存对齐访问#pragma pack(n) (n=1/2/4/8):按n字节对齐#pragma pack(2)struct mystruct1{int a;char b;short c;}struct mystruct2{int a;;double b;short c;}#pragma pack()以上这部分内容就是按2字节对齐...

weixin_30421223的博客 842

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C/C++内存对齐:从硬件原理到实战优化与跨平台避坑指南

内存对齐是现代计算机体系结构中的一项基础优化技术,其核心原理源于CPU的内存访问机制。CPU通常以固定大小的块(如4或8字节)为单位读写内存,如果数据存储的起始地址不是这个块大小的整数倍,就会导致一次访问被拆分为多次,并伴随额外的移位拼接操作,从而造成显著的性能损耗。从技术价值看,正确的内存对齐不仅能提升数据存取效率,还能避免在某些硬件架构(如ARM)上因未对齐访问引发的程序崩溃,确保操作的原子性。在工程实践中,内存对齐直接影响数据结构布局、缓存利用率(如避免伪共享),并与跨平台开发、网络通信序列化、硬件寄

weixin_30813225的博客 352

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C/C++内存对齐:原理、优化与跨平台开发实践

内存对齐是现代计算机体系结构为提升内存访问效率而引入的硬件级优化机制。其核心原理在于CPU以固定大小的字(如4字节、8字节)为单位访问内存,当数据存储在地址满足特定倍数要求时,可实现高效的对齐访问,否则可能引发性能损耗甚至硬件异常。理解并应用内存对齐,对于编写高性能、可移植的底层代码至关重要,尤其在涉及网络协议解析、文件序列化、跨平台数据结构设计等场景中。通过合理排列结构体成员、使用编译指令(如#pragma pack)或标准对齐属性(alignas),开发者能有效优化内存布局,减少填充字节,提升缓存利用率

weixin_34357887的博客 461

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算结构体的大小

#include<stc15f2k60s2.h> #define uchar unsigned char #define uint unsigned int uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF}; uchar yi,er,san,si,wu,liu,qi,ba; bit S4,S5,S6,S7; uchar num; void Allinit(void); void Delayms(

buhuidage的博客 233

C/C++结构体内存对齐:原理、计算与实战优化指南

内存对齐是计算机系统中提升数据访问效率的核心机制,其原理源于现代CPU以固定字长(如4或8字节)为单位读写内存。当数据存储地址满足特定对齐要求时,CPU可单次完成读取,否则需多次访问与拼接,严重影响性能。这一机制在C/C++语言中尤为关键,直接影响结构体的内存布局与大小。理解并合理运用内存对齐,能显著优化程序的内存使用效率与执行速度,避免因非对齐访问导致的性能下降或跨平台兼容性问题。在游戏引擎、高频交易、数据库内核等对性能敏感的场景中,精准控制结构体对齐是提升缓存利用率、防止伪共享(False Sharin

weixin_30938149的博客 1984

C++内存布局控制:从对齐基础到缓存行优化实战

内存对齐是现代计算机体系结构的基础概念,它源于CPU以固定大小数据块访问内存的硬件特性。其核心原理是编译器将数据放置在符合其大小整数倍的地址上,以避免多次内存访问带来的性能损失。这一机制对程序性能、稳定性及跨平台兼容性具有重要技术价值,尤其在处理结构体布局、多线程数据访问等场景时尤为关键。在工程实践中,通过`alignas`关键字、`#pragma pack`指令或编译器属性,开发者可以主动控制内存对齐,优化数据结构。这直接关系到缓存行利用效率,能有效避免多线程环境下的伪共享问题,并满足SIMD指令集等高性

weixin_30292843的博客 821

内存对齐:从硬件原理到C/C++实战,解决跨平台崩溃与性能优化

内存对齐是计算机系统中数据存储的基础概念,它要求数据在内存中的起始地址必须是特定值的整数倍。其核心原理源于CPU硬件设计,数据总线以固定宽度(如4字节、8字节)访问内存,未对齐的访问会导致性能骤降甚至硬件异常。这一机制的技术价值在于保障程序正确性、提升缓存命中率及优化执行效率。在工程实践中,内存对齐直接影响结构体布局、缓存友好性以及跨平台兼容性,是编写高性能、可移植C/C++代码的关键。本文通过分析结构体填充、缓存行优化等热词,并结合跨平台移植、SIMD指令集等高频搜索场景,深入探讨如何利用对齐规则规避程序

weixin_34268579的博客 323
上一篇: PCL概述
下一篇: PCL中的PointT类型
一杯盐水
博客等级 码龄10年 62粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值