深入理解内存对齐
来源:互联网 发布:multisim12数据库下载 编辑:程序博客网 时间:2024/05/22 03:19
内存对齐”应该是编译器的“管辖范围”。编译器为程序中的每个“数据单元”安排在适当的位置上。但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了。
对齐原因
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
对齐规则
#pragma pack(n)
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。
n:可选参数;指定packing的数值,以字节为单位;默认数值是8,合法的数值分别是1、2、4、8、16。
代码示例
使用默认##pragma pack(n)
#include <iostream>using namespace::std;//#pragma pack (n)class Csize{ public: int x; char y; void print();};void Csize::print(){ cout << sizeof(Csize) << endl;}int main(int argc,char *argv[]){ Csize a; a.print(); return 0;}
此时输出结果为8,即类Csize的长度为8。当程序未设定#pragma pack (n)时,默认n=8,即编译器执行8字节对齐。而类中最大数据元素为int型,占4个字节,此时执行较小的,也就是4字节对齐方式。类Csize中其他类型,如本例中的char类型只有1个字节,在执行4字节对齐的情况下,后面两个字节自动补齐(1+3),不添加任意数据。所以类Csize长度为4+(1+3)=8。
使用#pragma pack (2)
#include <iostream>#pragma pack(2)using namespace::std;class Csize{ public: int x; char y; void print();};void Csize::print(){ cout << sizeof(Csize) << endl;}int main(int argc,char *argv[]){ Csize a; a.print(); return 0;}
此时输出结果为6。由于#pragma pack (2),设定n=2,编译器执行2字节对齐。此时int型被拆分成两个部分,均为2字节,而char型本身为1字节,但是自动补全1个字节。所以2+2+(1+1)=6,即类Csize的长度为6。
注意:#progma pack (n)中,n只能取合法的计算机数值,即2^n。否则会出现警告,如:warning: alignment must be a small power of two, not 3 [-Wpragmas]
- 深入理解内存对齐
- 深入理解C/C++内存对齐
- 简明深入地理解“内存对齐”问题
- 深入理解字节对齐
- 【深入解析C内存对齐】
- 关于内存对齐的理解
- 内存对齐问题的理解
- 关于内存对齐的理解
- 关于内存对齐的理解
- sizeof理解01---内存对齐
- 内存对齐的方法理解
- 深入理解内存分区
- 深入理解内存地址
- 深入理解jvm内存
- 深入理解C语言字节对齐
- 深入理解计算机系统------->对齐限制笔记
- 内存对齐与#pragma pack的理解
- C语言 内存对齐的理解
- 我国量子通信卫星将于7月份发射 产业链股受益
- Andorid桌面小部件AppWidgetProvider应用
- 【bzoj1607】【Usaco2008 Dec】Patting Heads (数学) 题解&代码
- java 中 序列化和反序列化的概念
- 解决app-debug-unaligned.apk 无法删除
- 深入理解内存对齐
- CentOS7安装配置redis-3.0.0
- css样式定义标记(. # html)
- ADAS越来越热,这家公司为何能俾睨群雄
- 配置PHP环境
- Linux 安装sqlite
- 关于ecshop 时间
- 夜半对话
- 【自用】【DataFrame】数据离散化重组