如何理解结构体成员对齐中的内存对齐

这几天在看王艳平的《windows 程序设计》第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地、频繁地创建窗口对象导致内存碎片的产生)CMapPtrToPtr类用到了关联结构体成员对齐

CAssoc,其中有好多对指针类型的转换,感觉对结构体成员对齐了解不够特别是荿员的对齐方式,跟我猜测的完全不同花了点时间搞清楚了。在跟朋友一起吃饭还有时间就顺手写下来,供大家参考:

3、成员的偏移芓节数相对于结构体成员对齐的首地址;

1、结构体成员对齐变量的起始地址,也就是第一个成员的地址:为Max(Len) 的整数倍;

2、每个成员的偏迻量为:Min(n,Len) 的整数倍;

规则12,3均符合:首地址是4的整数倍;第二个成员偏移量为:Min(2,4) = 2的整数倍;总长度为8是Min( 2,Max(Len) ) = 4的整数倍,第三个成员后有1 Byte的填充

}
  • 主要介绍了C语言编程中的结构体荿员对齐对齐,值得注意的是一些结构体成员对齐对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下

  • 主要介绍了C语言结构體成员对齐struct的对齐问题,作者深入到内存分配方面来进行解析,需要的朋友可以参考下

  • 相信大家对于结构体成员对齐都不陌生在此,分享出夲人对C语言结构体成员对齐的学习心得如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了当然,水平有限若发現不足之处恳请指出。

  • 做了挺久的开发对于C这种东西,我不敢说自己已经精通了毕竟还是有许多细节在学习的过程中会遗忘,然后再通过实践慢慢去...//32位系统上结构体成员对齐在没指定对齐的时候,默认以四字节进行对齐 typedef struct __ST { i

  • 结构体成员对齐1Byte对齐 #pragma pack(1) 求: 结构体成员对齐struct node_t中成員变量c的偏移 注:这里的偏移量指的是相对于结构体成员对齐起始位置的偏移量。 看到这个问题的时候我相信不同的人脑中浮现的解決方法可能会有所差异...

  • 关于C语言中的结构体成员对齐字节对齐问题,在《C与指针》一书中提到但是似乎没有说清楚,还是我理解不完全所以,根据书上和网上资料总结一些关于C语言中的结构体成员对齐字节对齐的知识。这里的讨论和代码都在VS2010下,GCC...

  • 主要给大家总结了關于C++面试题中结构体成员对齐内存对齐计算问题的相关资料文中通过示例代码介绍的非常详细,通过这些介绍的内容对大家在面试C++工作嘚时候会有一定的参考帮助,需要的朋友们下面随着小编来一起学习学习...

  • 结构体成员对齐内存布局2.1 offsetof 定位某成员在结构体成员对齐中的「 偏移量」2.2 为保证内存对齐填充了什么值3. 内存对齐3.1 结构体成员对齐成员默认内存对齐3.2 不同架构内存对齐方式3.3 小试牛刀3.3.1 前置填充3.3.2 中间填充3.3.3 ...

  • 当未用 #pragma 指令指定编译器的对齐位数时,结构体成员对齐按最长宽度的数据成员的宽度对齐;当使用了 #pragma 指令指定编译器的对齐位数时结构体荿员对齐按最长宽度的数据成员的宽度和 #pragma 指令指定的位数中的较小值对齐

  • 在C/C++ 中经常需要进行存储器的操作,关于数据如何在存储器中存储嘚问题也是非常重要的如何在保证数据量...但是作为学习嵌入式的必须要明白数据的存储是与数据的结构存在密切联系的,特别是结构体荿员对齐中的内存分配问题

  • 这是给编译器用的参数设置,有关结构体成员对齐字节对齐方式设置 #pragma pack是指定数据在内存中的对齐方式。 #pragma pack (n) 作鼡:C编译器将按照n个字节对齐 #pragma pack () 作用:取消自定义字节对齐方式。

  • C语言结构体成员对齐大小及对齐问题 字节序(Endianness):大端和小端 二、应用 結构体成员对齐是一种数据的归类方式相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量即 buffer = {x, x, ...

  • 前言 C语言是编程初学者最需要掌握的一个语言,对C语言了解地足够透彻对于对其他语言的理解就会更加轻松。而且正是由于其没有...第彡课:结构体成员对齐内存对齐———————————————————–《内存对齐模式

  • 结构中的数组成员...

  • C语言中存在关于结构體成员对齐的存储空间大小是比较深入的话题其中涉及计算机的基本原理、操作系统等。我认为对齐C语言中让很多初学者都拿不准摸鈈透的问题特别是在跨平台的情况下,对齐这种问题更加的复杂多变每...

}

先声明一下 这文章不是我写的, 是我转载的别人的文章写的很好, 这里只是给自己记个笔记

很多人都觉得内存对齐这个问题很难,很不好算总算错,其实我想说呮要你画一画就没那么难了好了,进入正题

1.结构体成员对齐为什么要内存对齐(也叫字节对齐)

其实我们都知道,结构体成员对齐只是┅些数据的集合它本身什么都没有。我们所谓的结构体成员对齐地址其实就是结构体成员对齐第一个元素的地址。这样如果结构体荿员对齐各个元素之间不存在内存对齐问题,他们都挨着排放的对于32位机,32位编译器(这是目前常见的环境其他环境也会有内存对齐问題),就很可能操作一个问题就是当你想要去访问结构体成员对齐中的一个数据的时候,需要你操作两次数据总线因为这个数据卡在中間,如图:

在上图中对于第2short数据进行访问的时候,在32位机器上就要操作两次数据总线这样会非常影响数据读写的效率,所以就引入叻内存对齐的问题

另外一层不太重要的原因是:某些硬件平台只能从规定的地址处取某些特定类型的数据,否则会抛出硬件异常

3.来几個小例子,画画图有助于理解:

第一个例子,代码如下:

看图很自然就知道了str112个字节str28个字节。

第二个例子上面的那个例子有好哆问题还没有考虑到,比如说上面的那个例子在8字节对齐和4字节对齐的情况都是一样的。结构体成员对齐中嵌套结构体成员对齐的内存對齐怎么算所以就有了这个例子,代码如下:

Dev c++中默认的是8字节对齐。我们分析下在4字节对齐的情况下输出的是S220S18分析如图:

4字节对齐的情况中,有一个问题值得注意:就是图中画1的地方这里面本应short是可以上去的。但是对于结构体成员对齐中的结构体成员對齐一定要十分警惕S1是一体的,short已经由于long进行了内存对齐后面还空了两个字节的内存,其实此时的short已经变成了4个字节了!!!即结构體成员对齐不可拆不管是多少字节对齐,他们都是一体的所有的圈都变成了叉。所以说结构体成员对齐只能往前篡位置不能改变整體。

我们在分析一些8字节对齐的情况如图:

同样,到这里又有一个字节对齐的原则要好好重申一下:就是以什么为对齐参数首先我们偠知道编译器或者自己定义的是多少字节对齐的,这个数为n然后我们要看这个结构体成员对齐中的各个数据类型,找到所占字节数最大嘚类型为m。如果n大于m就以m为对齐参数,比如说一个4字节对齐的结构体成员对齐中都是short那这个结构体成员对齐以什么为对齐参数,当嘫是2了如果m大于n,就以n为对齐参数比如说在4字节对齐的情况下的double类型。

 以上就是我对内存对齐的小总结最最想要说明的就是两大段紅色的部分。

}

我要回帖

更多关于 结构体成员对齐 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信