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

什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。 在了解LLVM和Clang之前,先得了解一下什么是编译器。 编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序...

Welcome~ 9723

__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

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

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

步进电机驱动算法——梯形加减速算法

目录步进电机梯形加减速梯形加减速算法原理分析算法实现 步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单、实现容易、价格较低,这种开环控制方式,负载位置对控制电路没有反馈。 对于步进电机,控制脉冲的输入并不依赖于转子的位置,而是按一固定的规律发出控制脉冲,如果励磁变化太快,电机不能移动到新的位置,那么实际负载位置与理想位置就会产生一个偏差,就有可能出现失步或者过冲现象,所以需要使用加减速算法。 梯形加减速算法,S加减速算法等

aaa376070331的博客 3万+

从PSDK到ROS节点:实战GPS数据发布与CMake配置

本文详细介绍了如何从大疆PSDK获取GPS数据并封装为ROS节点的实战过程,包括PSDK编译、GPS数据订阅、ROS节点实现及CMake配置优化。通过具体代码示例和调试技巧,帮助开发者快速实现无人机传感器数据与ROS系统的集成,提升开发效率。

weixin_30843605的博客 457

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

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

weixin_39534100的博客 259

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

C 语言的骚操作

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

2509_93923260的博客 541

写给开发人员的实用密码学 - Hash算法

说到Hash(哈希),开发人员应该不陌生,比如Hash表是一种非常常用的数据结构,通过Hash表能够根据键值快速找到数据。哈希函数将文本(或其他数据)映射为整数,从而能够提高检索效率。密...

云水木石 1503

【Win10/11】Windows电脑WiFi显示小地球/断网的解决方法 Windows WiFi小地球、网络连接中断、网络重置、无线网卡驱动、Win10/Win11网络修复

最近经常有粉丝留言问我,Windows 电脑突然连不上 WiFi,右下角网络图标显示成了“小地球 🌐”,或者干脆提示“未连接 - 没有可用的连接”。明明其他设备网络都正常,唯独自己的电脑断了。作为在互联网大厂混迹多年的前端程序员,我自己也碰到过这个问题。总结几种比较常见、亲测有效的解决方法,写出来供大家参考,希望能帮你快速恢复上网!问题原因推荐解决方法系统设置错乱使用网络重置功能驱动异常或冲突卸载后重启自动安装驱动驱动版本过旧手动更新网卡驱动实在不行考虑使用系统还原点或重装系统这几个方法中,

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3848

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

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

weixin_34226706的博客 6963

SAP RAP学习系列合集介绍

《SAP RAP学习系列合集:从入门到部署的完整指南》摘要: 本文介绍了作者创建的SAP RAP学习系列合集,涵盖RAP开发从基础概念到实战部署的全流程。系列目前包含17篇文章,系统讲解了RAP核心开发技术:从数据建模、UI构建到行为定义(包括并发控制、草稿功能、授权验证等),最后详细演示了应用部署到Fiori Launchpad的两种方案(OP版和ES版)。

DeveloperMrMeng的博客 1490

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

weixin_30813225的博客 352

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

weixin_34357887的博客 461

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算结构体的大小

#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、付费专栏及课程。

余额充值