首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >沿4字节边界对齐

沿4字节边界对齐
EN

Stack Overflow用户
提问于 2009-08-06 01:51:44
回答 9查看 23.9K关注 0票数 12

我最近开始考虑对齐..。这是我们通常不需要考虑的事情,但我已经意识到一些处理器要求对象沿4字节边界对齐。这到底是什么意思,以及哪些特定系统有对齐要求?

假设我有一个任意的指针:

unsigned char* ptr

现在,我尝试从内存位置检索一个双精度值:

double d = **((double*)ptr);

这会造成问题吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-08-06 02:05:27

这肯定会在某些系统上造成问题。

例如,在基于ARM的系统上,您无法寻址未与4字节边界对齐的32位字。这样做将导致访问冲突异常。在x86上,您可以访问这种未对齐的数据,尽管性能会受到一些影响,因为必须从内存中获取两个单词,而不是一个单词。

票数 22
EN

Stack Overflow用户

发布于 2009-08-06 02:33:26

以下是对对齐的描述:

4.1.1对齐单词、双字、四字和双四字

单词、双字和四字不需要在自然边界上的内存中对齐。字、双字和四字的自然边界分别是偶数地址、可被4整除的地址和可被8整除的地址。然而,为了提高程序的性能,数据结构(尤其是堆栈)应该尽可能在自然边界上对齐。这是因为处理器需要两次存储器访问才能进行非对齐的存储器访问;对齐的访问只需要一次存储器访问。跨越4字节边界的字或双字操作数或跨越8字节边界的四字操作数被视为未对齐,并且需要两个单独的内存总线周期进行访问。

一些在双四字上操作的指令要求内存操作数在自然边界上对齐。如果指定了未对齐的操作数,则这些指令会生成通用保护异常(#GP)。双四字的自然边界是可被16整除的任何地址。在双四字上操作的其他指令允许不对齐访问(不会生成一般保护异常)。然而,从存储器访问未对齐的数据需要额外的存储器总线周期。

请不要忘记,参考手册是负责任的开发人员和工程师的最终信息来源,因此,如果您处理的是英特尔CPU等有详细记录的内容,请查看参考手册中有关该问题的说明。

票数 14
EN

Stack Overflow用户

发布于 2009-08-06 03:51:02

是的,这可能会导致许多问题。C++标准实际上并不能保证它能正常工作。你不能随意地在指针类型之间进行转换。

当您将字符指针转换为双指针时,它将使用reinterpret_cast,这将应用实现定义的映射。您不能保证结果指针将包含相同的位模式,或者它将指向相同的地址或任何其他地址。在更实际的术语中,也不能保证您正在读取的值是正确对齐的。如果数据是以一系列字符的形式写入的,那么它们将使用字符的对齐要求。

至于对齐意味着什么,本质上就是值的起始地址应该可以被对齐大小整除。例如,地址16在1、2、4、8和16字节边界上对齐,因此在典型的CPU上,这些大小的值可以存储在那里。

地址6没有在4字节边界上对齐,所以我们不应该在那里存储4字节的值。

值得注意的是,即使在不强制或要求对齐的CPU上,访问未对齐值通常仍会显著减慢。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1237963

复制
相关文章
字节对齐
什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因: 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来
三丰SanFeng
2018/01/16
2.1K0
结构体字节对齐
结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。 计算结构变量的大小必须讨论数据对齐的问题。为了使CPU存取的速度最快(这同CPU取数操作有关),c++在处理数据时经常把结构变量中的成员的大小按照4或
猿人谷
2018/01/17
1.3K0
结构体字节对齐
C/C++字节对齐
各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。
luciozhang
2023/04/22
4560
结构体字节对齐
      在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。       内存对齐的原因:       1)某些平台只能在特定的地址处访问特定类型的数据;       2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对
_gongluck
2018/03/08
1.6K0
结构体字节对齐
特别的字节对齐问题
有如下一个结构体: struct X {         uint32_t a;         char* b[0]; }; sizeof(X)的值为多少了? 关键点:数组维度为0的成员不参与,但是它的类型参与。 注:在x86_64上“char*”的algin值为8,x86上为4。 那么: #pragma pack(8) struct X {         uint32_t a;         char* b[0]; }; #pragma pack() sizeof(X)值为8,因为alignof(char*)和pack(8)最小值为8,故按8字节对齐。 #pragma pack(4) struct X {         uint32_t a;         char* b[0]; }; #pragma pack() sizeof(X)值为8,因为alignof(char*)和pack(4)最小值为4,故按4字节对齐。 #pragma pack(1) struct X {         uint32_t a;         char* b[0]; }; #pragma pack() 按1字节对齐时,sizeof(X)值为8,因为alignof(char*)和pack(1)最小值为4,故按1字节对齐。 如果结构体变成: struct X {         uint32_t a;         char b[0]; }; sizeof(X)的值为多少了?
一见
2018/08/02
4940
[C&C++]C语言字节对齐#pragma pack()
原文链接:https://blog.csdn.net/humanking7/article/details/80979517
祥知道
2020/03/10
1.6K0
C语言:内存字节对齐详解[转载]
一、什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。 二、对齐的实现 通常,我们写程序的时候,不需要考虑对齐问题。编译器会替我们选择适合目标平台的对齐策略。当然,我们也可以通知给编译器传递预编译指令而改变对指定数据的对齐方法。 但是,正因为我们一般不需要关心这个问题,所以因为编辑器对数据存放做了对齐,而我们不了解的话,常常会对一些问题感到迷惑。最常见的就是struct数据结构的sizeof结果,出乎意料。为此,我们需要对对齐算法所了解。 对齐的算法: 由于各个平台和编译器的不同,现以本人使用的gcc version 3.2.2编译器(32位x86平台)为例子,来讨论编译器对struct数据结构中的各成员如何进行对齐的。 设结构体如下定义: struct A { int a; char b; short c; }; 结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个。所以A用到的空间应该是7字节。但是因为编译器要对数据成员在空间上进行对齐。 所以使用sizeof(strcut A)值为8。 现在把该结构体调整成员变量的顺序。 struct B { char b; int a; short c; }; 这时候同样是总共7个字节的变量,但是sizeof(struct B)的值却是12。 下面我们使用预编译指令#pragma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。 #progma pack (2) /*指定按2字节对齐*/ struct C { char b; int a; short c; }; #progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct C)值是8。 修改对齐值为1: #progma pack (1) /*指定按1字节对齐*/ struct D { char b; int a; short c; }; #progma pack () /*取消指定对齐,恢复缺省对齐*/ sizeof(struct D)值为7。 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。 这里面有四个概念值: 1)数据类型自身的对齐值:就是上面交代的基本数据类型的自身对齐值。 2)指定对齐值:#pragma pack (value)时的指定对齐值value。 3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。 有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是 数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍,结合下面例子理解)。这样就不难理解上面的几个例子的值了。 例子分析: 分析例子B; struct B { char b; int a; short c; }; 假设B从地址空间0x0000开始排放。该例子中没有定义指定对齐值,在笔者环境下,该值默认为4。第一个成员变量b的自身对齐值是1,比指定或者默认指 定对齐值4小,所以其有效对齐值为1,所以其存放地址0x0000符合0x0000%1=0.第二个成员变量a,其自身对齐值为4,所以有效对齐值也为 4,所以只能存放在起始地址为0x0004到0x0007这四个连续的字节空
chain
2019/05/26
2.8K0
字节对齐,看这篇就懂了
字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?本文将简单理一理字节对齐的那些事。
编程珠玑
2020/05/22
25.7K2
c++ ​string的字节对齐
string为basic_string的typedef,对于basic_string我们看到里面:
公众号guangcity
2019/11/05
1.7K0
Python: struct 模块之字节对齐问题
在二进制写文件时,可以用 模块将数据捆绑成结构体转化成字节流,为了方便与 交互,避免 在读取二进制字节流时因为 的字节对齐问题而造成不必要的麻烦, 的 模块默认按照 的字节对齐方式进行对齐。
f_zyj
2021/12/07
1.9K0
c语言结构体字节对齐详解
从以上结果可以看出,结构体st1在32位下是按照4个字节来对齐的,在64位下则是按照8个字节来对齐的,结构体st2则不管32位还是64位则都是按照1个字节对齐的。
cpp加油站
2021/04/23
2.6K0
C语言中字节对齐问题分析2
简单的说来就是为了提高cpu的性能,或者说是为了提高程序运行的效率。当然,在其背后更有简化cpu设计的功效。因此,我们写的c程序为了获得更高的运行效率就必须最大限度的满足cpu对于字节对齐的要求,编译器在其中起着至关重要的作用。
随心助手
2020/05/12
1.6K0
字节对齐不慎引发的挂死问题
之前程序是32位的,切到64位之后,一些隐藏的问题就暴露了。这不,一个由字节对齐导致的挂死问题就出来了。
编程珠玑
2019/08/08
1.1K0
C语言中字节对齐问题分析1
字节对齐(alignment)是CPU在性能方面所面临的一个非常重要的问题。有些处理器能自动处理不对齐数据的访问(对字节对齐要求不严格),但是,有些处理器却无法处理(对字节对齐要求很严格)。当处理器无法处理对齐问题时,其将引发一个异常(exception),当然从程序的角度来说就是出错(crash)。
随心助手
2020/05/12
1.4K0
理一理字节对齐的那些事
字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么是字节对齐?对齐准则又是什么?为什么要字节对齐呢?字节对齐对我们编程有什么启示?本文将简单理一理字节对齐的那些事。
编程珠玑
2019/07/12
8600
为什么要自己开发SCL上升沿或下降沿指令?
在SIMATIC S7-1500和S7-1200 PLC中,选择编程语言为SCL时,可以看到TIA Portal软件自带两个指令分别用于检测信号的上升沿和下降沿,如图1所示:
科控物联
2022/03/29
2.5K0
为什么要自己开发SCL上升沿或下降沿指令?
Int64针对32位架构是按照4字节还是8字节对齐?
作为构建.NET的标准,CLI Spec(ECMA-335)针对基元类型的对齐规则具有如下的描述。按照这个标准,我们是这么理解的:8字节的数据类型(int64、unsigned int64和float64)根据采用的机器指令架构选择4字节或者8字节对其。进一步来说,它们在x86/x64机器上的对其字节分别为4字节和8字节。
蒋金楠
2023/07/21
3640
Int64针对32位架构是按照4字节还是8字节对齐?
c/c++补完计划(四): 字节对齐和虚继承
前言 猪场最爱考的内容, 亲测. 结构体大小 先来看个基础的: #include <iostream> #pragma pack (8) using namespace std; struct A { char a; int b; double c; }; int main() { // 1: 13 // 2: 14 // 4: 16 // 8: 16 cout << sizeof(A) << endl; } 按理说, ch
sean_yang
2020/07/23
6920
c/c++补完计划(四): 字节对齐和虚继承
C语言结构体字节对齐 | 结构体与联合
当我们创建一个结构体变量时,会向内存申请所需的空间,用来存储结构体成员的内容。我们可以将其理解为结构体成员会按照特定的规则来存储数据内容。
CtrlX
2022/10/04
2.3K0
C语言结构体字节对齐 | 结构体与联合
强大的JTAG边界扫描4-STM32边界扫描应用
试想这样一个场景,我们新设计了一款集成了很多芯片的板卡,包括BGA封装的微控制器,如FPGA/MCU,还有LED、按键、串口、传感器、ADC等基本外设。
单片机点灯小能手
2023/09/18
5460
强大的JTAG边界扫描4-STM32边界扫描应用

相似问题

从8字节边界对齐地址4字节

21

如何在4字节边界对齐扫描线

11

全局变量是否与4字节的边界对齐?

12

如何将C结构与4字节边界对齐?

23

为什么双对齐为8字节边界而不是4字节?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文