Data Alignment

FPGA新手避坑:SelectIO向导里Data Alignment选错,你的时序可能全乱了 本文详细解析了Xilinx FPGA中SelectIO IP核的Data Alignment配置对时序的关键影响,特别针对DDR接口的数据对齐问题。通过对比Opposite Edge、Same Edge和Same Edge Pipelined三种模式的特点及适用场景,帮助FPGA开发者避免常见时序陷阱,并提供实际调试案例和最佳配置建议,确保高速数据采集的稳定性。 阅读详情

#pragma pack

Applies to C Applies to C++

 

Preface

    很多 CPU ,如基于 Alpha, IA-64, MIPS, 和 SuperH 体系的,拒绝读取未对齐数据。当一个程序要求其中之一的 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM, MIPS, 和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时默认通知应用程序一个异常。

对齐性
     
  对齐性是一种内存地址的特性,表现为内存地址模上 2 的幂。例如,内存地址 0x0001103F 模 4 结果为 3 ;这个地址就叫做与 4n + 3 对齐, 4 指出了所选用的 2 的幂的值。内存地址的对齐性取决于所选择的关于 2 的幂值。同样的地址模 8 结果为 7 。

       一个内存地址符合表达式 Xn + 0 ,那么就说该地址对齐于 X 。

       CPU 执行指令就是对存储于内存上的数据进行操作,这些数据在内存上是以地址为标记的。对于地址来说,单独的数据会有其占用内存的字节数。如果它的地址对齐于它的字节数,那么就称作该数据自然对齐,否则称为未对齐。例如,一个标记 8 字节的浮点数据的地址对齐于 8 ,那么这个数据就自然对齐。

数据对齐性的编译处理
      
设备编译器以一种防止造成数据未对齐的方式来对数据进行地址分配。

       对于单个的数据类型,编译器为其分配的地址是数据类型字节数的倍数。因此,编译器分配给 long 型变量的地址为 4 的倍数,就是说以 2 进制表示地址的话,最后两位为 0 。

       另外,编译器以一种自然对齐每个结构成员的方式来填充结构体。参看下面的代码里面的结构体 struct x_ 。

     struct x_
      {
            char a;     // 1 byte
            int b;      // 4 bytes
            short c;    // 2 bytes
            char d;     // 1 byte
      } MyStruct;

      编译器填充这个结构以使其自然对齐。

DataAlignment Phenomenon

struct A {char a; long b; char c; long d;};

struct B {char a; char c; long b; long d;};

#progma pack(push,1)
struct C {char a; long b; char c; long d;};
#progma pack(pop)

sizeof(A) = 16
sizeof(B) = 12
sizeof(C) = 10

Description

The #pragma pack directive modifies the current alignment rule for members of structures following the directive.

 

Syntax

Syntax Diagram

where:


1 | 2 | 4 | 8 | 16 Members of structures are aligned on the specified byte-alignment, or on their natural alignment boundary, whichever is less.
nopack No packing is applied, and "nopack" is pushed onto the pack stack
pop The top element on the pragma pack stack is popped.
(no argument specified) Specifying #pragma () has the same effect as #pragma (pop).

 

Notes

The #pragma pack directive modifies the current alignment rule for only the members of structures whose declarations follow the directive. It does not affect the alignment of the structure directly, but by affecting the alignment of the members of the structure, it may affect the alignment of the overall structure according to the alignment rule.

The #pragma pack directive cannot increase the alignment of a member, but rather can decrease the alignment. For example, for a member with data type of integer (int), a #pragma pack(2) directive would cause that member to be packed in the structure on a 2-byte boundary, while a #pragma pack(4) directive would have no effect.

The #pragma pack directive is stack based. All pack values are pushed onto a stack as the source code is parsed. The value at the top of the current pragma pack stack is the value used to pack members of all subsequent structures within the scope of the current alignment rule.

A #pragma pack stack is associated with the current element in the alignment rule stack. Alignment rules are specified with the -qalign compiler option or with the #pragma options align directive. If a new alignment rule is created, a new #pragma pack stack is created. If the current alignment rule is popped off the alignment rule stack, the current #pragma pack stack is emptied and the previous #pragma pack stack is restored. Stack operations (pushing and popping pack settings) affect only the current #pragma pack stack.

The #pragma pack directive causes bitfields to cross bitfield container boundaries.

 

Examples
  1. In the code shown below, the structure S2 will have its members packed to 1-byte, but structure S1 will not be affected. This is because the declaration for S1 began before the pragma directive. However, since the declaration for S2 began after the pragma directive, it is affected.
    struct s_t1 {
        char a;	
        int b;
        #pragma pack(1)
        struct s_t2 {	
                char x;
                int y;
        } S2;
        char c;
        int b;
    } S1;
    
  2. This example shows how a #pragma pack directive can affect the size and mapping of a structure:
    struct s_t {
    	char a;
    	int b;
    	short c;
    	int d;
    }S;
     
    
    Default mapping: With #pragma pack(1):
    sizeof S = 16 sizeof S = 11
    offsetof a = 0 offsetof a = 0
    offsetof b = 4 offsetof b = 1
    offsetof c = 8 offsetof c = 5
    offsetof d = 12

    offsetof d = 7

    align of a = 1 align of a = 1
    align of b = 4 align of b = 1
    align of c = 2 align of c = 1
    align of d = 4

    align of d = 1

     

(2007.10.15)请注意上文中红线所示部分,现补充解释如下:

#pragma pack(8)

struct s1{
               short a;
               long b;
};

struct s2{
              char c;
              s1 d;
              long long e;
};

#pragma pack()

sizeof(S2)结果为24.
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.
                          a    b
S1的内存布局:11**,1111,
                          c    S1.a S1.b     d
S2的内存布局:1***,11**,1111,****11111111

这里有三点很重要:
1.每个成员分别按自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

补充一下,对于数组,比如:
char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个.

 
从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南 本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。 阅读详情

相关推荐

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

UCOS学习问题(第一步)

UCOS系统使用 问题1:printf打印浮点型数据问题 在不使用UCOS系统的时候,pirntf和以很正常的打印整型,短整型,浮点型类的数据,但是在使用UCOS系统之后,printf打印整型和短整型数据还是没有问题的,但是打印浮点型数据的时候就会出现很严重的问题,乱码。经过分析与资料查找,得知,硬件堆栈的数据对齐方式是8位的,但是如果使用UCOS的话,每个任务都有自己的任务堆栈,这些堆栈的对

WXN996604的专栏 872

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1161

keil c语言浮点数,Keil MDK浮点数支持不正常的解决方案

在调用printf调试浮点数的时候,在内存中表示正确,但是打印数据就都为0.00,其他整形数据表示正常。经查资料得知,浮点数要求堆栈八字节对齐导致,如果系统的默认堆栈不是八字节对齐的一定会出现此问题。将变量八字节对齐即可。解决方案:1、IAR下的解决方案:通过#pragma data_alignment指定对齐字节数例如:#pragma data_alignment=8OS_STK Task1_L...

weixin_35715366的博客 4611

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 379

GEE案例:Landsat 5、7、8影像构建1985-2023年rsei生态遥感指数详细代码

rsei(Regional Silviculture Ecological Index,地区林业生态指数)是一种生态遥感指标,用于评估森林生态系统的健康状况和生态服务。构建1985-2023年的rsei生态遥感指,主要需要使用Landsat 5、7和8的遥感影像数据。以下是一种可能的构建方法:1. 数据获取:从美国地质调查局(USGS)或其他可靠数据提供商处获取Landsat 5、7和8的遥感影像数据。确保选择的影像具有适当的空间和时间分辨率,以覆盖所需的时间段。

此星光明博客 3401

#pragma DATA_ALIGN作用

#pragma,是一个编译控制指令,可以在编译时动态地调整编译选项,这种指令在不同的编译系统中是不同的. #pragma DATA_ALIGN( symbol,constant) 指令的作用是:排列排列symbol到constant指点的列边界上. #pragma DATA_ALIGN( rxdata_stream,   128)就是让rxdata_stream地址的末尾7位是

*^^^^^^^* 1万+

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

Ucos printf浮点数问题

1. 问题描述: 当使用uocs printf(),sprintf()打印浮点数问题会出问题,但是裸机不会出问题 我现在使用STM32跑UCOS,在使用sprintf打印float类型时候,不管是何值最后都是0.0,但是类型是int,short类型时没有问题。网上查到是任务堆栈8字节对齐就可以了。 当没有操作系统时,系统堆栈是8字节对齐的,但是当使用ucos时,用户任务不一定是8

东来东往 2169

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3078

2ED2410-EM:12v / 24v智能模拟高侧MOSFET栅极驱动器

12v / 24v智能模拟高侧MOSFET栅极驱动器。2ED2410-EM具有输入CPP和CPN的电压比较器。该比较器可用于基于任何模拟电压触发SAFESTATE模式,甚至是外部电压2ED2410-EM。CPP为比较器的正输入,CPN为负输入。VcPREF可以通过微控制器进行调节,也可以通过板载电源芯片(如英飞凌SBC)或简单的分压器在限制VcP(REF)内进行固定,以保持稳定性。使用此比较器允许2ED2410-EM进入SAFESTATE并独立于微控制器关闭MOSFET。

让学习成为一种习惯 2188

(keil MDK)ucos浮点数支持不正常的解决方案

最近遇到了一个问题,就是ucosii中浮点数调用printf显示不正常,但是裸机上对浮点数支持正常,以下是详细情况。 在ucos中调用printf调试浮点数的时候,在内存中表示正确,但是打印数据就都为0.00,其他整形数据表示正常。 定义了一个float类型的变量i,在内存中的数据是这样的,如下图所示:           但是当调用pr

waitig's blog 7091

导数与微分在 FPS 射击游戏中的实际应用:把“手感”算出来

摘要:射击游戏开发中,单线程适用于简单小游戏(如单机打靶),所有任务由主线程顺序处理,代码简单但效率较低;多线程则适合复杂场景(如多人在线3D大作),通过渲染、逻辑、网络、音效等线程分工协作,确保画面流畅、响应迅速和实时同步。选择依据取决于游戏复杂度、联网需求和性能要求,小型游戏用单线程,大型高要求项目必须采用多线程架构。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3278

Eclipse/IAR字节对齐(align()/pack()/data_alignment)问题

data_alignment定义结构体变量的起始地址按n字节对齐,pack命令是控制结构体里面的成员按什么格式对齐,两者修饰的内容不一样。

weixin_42438100的博客 1967

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Data alignment

C语言,在对一个 struct variable使用sizeof operator(操作符)的时候,往往得到的结果并不是我们想象中——struct内所有member的size之和。  当清楚了什么是Data alignment(数据对齐),对这个问题就豁然开朗了。  Data Alignment  Data Alignment 并非针对 Data 本身,而是Data(Variab

路漫漫其修远 1345

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

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

Structure Member Alignment, Padding and Data Packing

What do we mean by data alignment, structure packing and padding? Predict the output of following program. #include   // Alignment requirements // (typical 32 bit machine)   // c

u010993581的专栏 630

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Data Structure Alignment 2

Data Structure Alignment 2 在前面的一篇文章中,似乎明白了结构体对齐的基本规则,但是有些地方还是含糊不清。比如看下面的这个程序。 根据前面的规则很容易算出,sizeof(A)=16, sizeof(B)=24.但是在GCC下运行的结果却不是这样,所以一时有点不知问题所起,内存对齐都是编译器做的工作 所以各个平台下面的实现没有得到统一规范,虽然可以#pragma

博观约取 1162

关于数据对齐(Data Alignment)

关于数据对齐 About Data Alignment数据对齐的由来1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:为了访问未对齐的内存,处理器需要作多次内存访问,然而,对齐的内存访问仅需要一次访问。这对于效率而言有一定的下降。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为

夏至亦韵 2122

Data Structure alignment

Data structure alignment is the way data is arranged and accessed in computer memory. Data alignment and Data structure padding are two different issues but are related to each other and together known as Data Structure alignment.Data alignment: Data alig.

huixizhu的专栏 198

转:data alignment的作用

<br />研究的起源:研究DMA支援的一个特点就是byte alignment的作用,老大上次特别提出,还是好好研究一番,这个资料挺有意思。<br /><br /><br /><br />Data alignment: Straighten up and fly right  Data alignment: Straighten up and fly right<br />Align your data for speed and correctness<br />Memory access granul

sherry_2010的专栏 2837

Data structure alignment

Data structure alignment From Wikipedia, the free encyclopedia Jump to: navigation, search This article needs additional citations for verification. Please help improve this article by adding...

weixin_34130389的博客 273

数据对齐(Data Alignment)

Linux 的对齐政策遵循 2 字节数据类型 (e.g.,short) 的地址必须是 2 的倍数,更大的数据类型 (e.g.,int*,float,和 double) 的地址必须是 4 的倍数。使用 9 字节的分配,不可能满足 d 中每个元素的对齐要求,因为这些元素的地址将为 Xd,Xd + 9,Xd + 18,Xd + 27。如果我们以 9 字节打包该结构体,对于字段 i,和 j 依然能满足对齐要求,只要结构体的起始地址能满足 4 字节对齐的要求。因为字段 i 的偏移是 0,该字段的地址就是 r 的值。

qq_41278986的博客 914

数据对齐Data Alignment

看到两篇很不错的文章,记录一下; 这篇文章详细介绍了为什么要进行数据对齐(cpu读取内存的模型),数据对齐基础,并分析了数据对齐对程序性能的影响。 https://www.ibm.com/developerworks/library/pa-dalign/#ibm-pagetitle-h1下面这篇文章是一位韩国人的个人网站上的文章,讲得比较简单易懂,也用代码进行了测试,并介绍了使用编译命令#pra

ColourfulPanda的博客 501

data structure alignment(数据对齐)

概述: 数据对齐指数据在计算机内存中排放和获取的方式。包含三个方面:数据对齐(data alignment)、数据结构填充(data alignment)、打包(packing) 如果数据是自然对齐的话,CPU读写会更高效。自然对齐指数据地址是数据大小的倍数。为保证自然对齐,可能会在结构的开头或结尾进行一些填充 定义: 内存地址对齐:一个内存地址a被称为n-byte对齐,如果a是n的倍数,...

qq_40711741的博客 881

Data Alignment 数据对齐 from MSDN

About Data Alignment  Visual Studio 2005 14 out of 19 rated this helpful - Rate this topic Many CPUs, such as those based on Alpha, IA-64, MIPS, and SuperH architectures, refu

沧海一声笑的专栏 777

Multiple sequence alignment Benchmark Data set

Multiple sequence alignment Benchmark Data set 1. 汇总: 序列比对标准数据集: http://www.drive5.com/bench/ This is a collection of multiple alignment benchmarks in a uniform format that...

Tsingke 282
上一篇: 为什么 char** 不能自动转化为 const char**
下一篇: 关于CString
undefined_behavior
博客等级 码龄19年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值