内存对齐其实是为了在程序运行的时候更快的查找内存而做的一种编译器优化。

我们先看这样一个例子:

 #include <iostream>
using namespace std; struct vpoet
{
int a; //4 bytes
char b; //1 bytes
double c; // 8 bytes
char *d; //4 bytes
int e; //4 bytes
}; int main()
{
cout<<"sizeof(vpoet)="<<sizeof(vpoet)<<endl;
return ;
}

运行结果:

这个结构体大小为24个字节,但是我们仔细算一算其字节数发现其实际上只有4+1+8+4+4=21个字节,那是如何算出来24个字节的

呢,其实在默认情况下编译器是按照结构体中所占字节最大的成员来进行内存对齐的。比如在结构体vpoet中最大的是double double

占8个字节,那么编译器默认按8个字节的方式对齐那么编译器将按照大于实际字节数的double最小整数倍来进行内存分配。因而这里

实际是在结构体的成员b后面填充了三个字节用于对齐。

那么问题来了,对齐方式可以改吗?可以我们可以在文件头加上

 #pragma pack(n)

来改变内存对齐的字节数

比如当我们按照一个字节对齐的时候:

 #include <iostream>
using namespace std;
#pragma pack(1) struct vpoet
{
int a; //4 bytes
char b; //1 bytes
double c; // 8 bytes
char *d; //4 bytes
int e; //4 bytes
}; int main()
{
cout<<"sizeof(vpoet)="<<sizeof(vpoet)<<endl;
return ;
}

运行结果:

当我们按照1字节对齐的时候,编译器将为该结构体分配本身实际大小的字节数

当我们以2字节对齐的时候

 #pragma pack(2)

此时的输出结果为:

当我们按照2字节对齐的时候,编译器将为结构体成员b后面填充一个空字节用于内存对齐。

记住这样一个规律:

默认情况下编译器将按照实际结构体中占内存字节数最大的成员的整数倍进行分配,该最大的整数倍应正好大于或者等于结构

体实际所占的内存字节数

struct内存对齐的更多相关文章

  1. struct内存对齐1:gcc与VC的差别

    struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则:  ...

  2. 利用php unpack读取c struct的二进制数据,struct内存对齐引起的一些问题

    c语言代码 #include <stdio.h> struct test{ int a; unsigned char b; int c; }; int main(){ FILE *fp; ...

  3. 什么是内存对齐,go中内存对齐分析

    内存对齐 什么是内存对齐 为什么需要内存对齐 减少次数 保障原子性 对齐系数 对齐规则 总结 参考 内存对齐 什么是内存对齐 弄明白什么是内存对齐的时候,先来看一个demo type s struct ...

  4. 【转】C/C++ struct/class/union内存对齐

    原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...

  5. 内存对齐-C语言struct内存占用问题

    转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi ...

  6. Net的struct的内存对齐问题

    很少有人谈起struct的内存对齐问题, 就是在很多C#书中, 也很少提及. 但在实际应用中, 如果不注意内存对齐, struct比较大的话, 则会浪费一定的内存.    先从一个实例看起. publ ...

  7. 内存对齐与ANSI C中struct型数据的内存布局 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3032209.html 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将 ...

  8. 内存对齐与ANSI C中struct型数据的内存布局

    当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不 ...

  9. 浅析内存对齐与ANSI C中struct型数据的内存布局-内存对齐规则

    这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...

随机推荐

  1. HDU 1074 Doing Homework (状态压缩 DP)

    题目大意: 有 n 项作业需要完成,每项作业有上交的期限和需完成的天数,若某项作业晚交一天则扣一分.输入每项作业时包括三部分,作业名称,上交期限,完成所需要的天数.求出完成所有作业时所扣掉的分数最少, ...

  2. hbase的thriftserver开启

    说明:hbase的thriftserver默认已经编译好,可以使用,不需要跟hadoopthrift一样配置. 要使用Hbase的thrift接口,必须将它的服务启动,命令行为: hbase-deam ...

  3. 【DataStructure】Description and usage of queue

    [Description] A queue is a collection that implements the first-in-first-out protocal. This means th ...

  4. Ubuntu包管理命令 dpkg、apt和aptitude

    起初GNU/Linux系统中仅仅有.tar.gz.用户 必须自己编译他们想使用的每个程序.在Debian出现之後,人们觉得有必要在系统 中加入一种机 制用来管理 安装在计算机上的软件包.人们将这套系统 ...

  5. NET基础课--开发工具实用功能

    1.浏览代码结构 类视图 2.重构功能 提取长的的方法体中的部分方法到单独函数中 路径:选择代码段,右击重构----提取方法 3.代码结构 a 代码对齐 点[编辑]-[高级]-[设置选定内容的格式] ...

  6. 使用Unity在MVC上实现动态注入

    一.前言 通过前一篇的文章介绍使用unity轻量级的依赖注入容器,本文就介绍在MVC上使用unity依赖注入控制器和控制器中的日志属性. 实现MVC中新提供 的两个接口:IDependencyReso ...

  7. 利用@media实现IE hack

    虽然对IE深恶痛绝,却不能拒绝. 使用@media实现IE hack的方法,以记之. 仅IE6和IE7识别@media screen\9 { .selector { property: value; ...

  8. jQ全选效果

    <ul id="list"> <li><label><input type="checkbox" value=&quo ...

  9. CSS3动画之旋转魔方盒

    步骤: 1.大盒子里盛放六个子盒子代表立方体的6个面: 2.子盒子开启3d效果  transform-style:preserve-3d; 3.上下面沿X轴旋转90度,一个上移盒子一半高,一个下移盒子 ...

  10. Ecstore 2.0 报表显示空白

    INSERT INTO `sdb_ectools_analysis` (`id`, `service`, `interval`, `modify`) VALUES (, ), (, ), (, ); ...