struct内存对齐
内存对齐其实是为了在程序运行的时候更快的查找内存而做的一种编译器优化。
我们先看这样一个例子:
#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内存对齐的更多相关文章
- struct内存对齐1:gcc与VC的差别
struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: ...
- 利用php unpack读取c struct的二进制数据,struct内存对齐引起的一些问题
c语言代码 #include <stdio.h> struct test{ int a; unsigned char b; int c; }; int main(){ FILE *fp; ...
- 什么是内存对齐,go中内存对齐分析
内存对齐 什么是内存对齐 为什么需要内存对齐 减少次数 保障原子性 对齐系数 对齐规则 总结 参考 内存对齐 什么是内存对齐 弄明白什么是内存对齐的时候,先来看一个demo type s struct ...
- 【转】C/C++ struct/class/union内存对齐
原文链接:http://www.cnblogs.com/Miranda-lym/p/5197805.html struct/class/union内存对齐原则有四个: 1).数据成员对齐规则:结构(s ...
- 内存对齐-C语言struct内存占用问题
转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi ...
- Net的struct的内存对齐问题
很少有人谈起struct的内存对齐问题, 就是在很多C#书中, 也很少提及. 但在实际应用中, 如果不注意内存对齐, struct比较大的话, 则会浪费一定的内存. 先从一个实例看起. publ ...
- 内存对齐与ANSI C中struct型数据的内存布局 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-3032209.html 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将 ...
- 内存对齐与ANSI C中struct型数据的内存布局
当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不 ...
- 浅析内存对齐与ANSI C中struct型数据的内存布局-内存对齐规则
这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...
随机推荐
- Only2 Labs — A Visual Design Studio
Only2 Labs - A Visual Design Studio 设计合作 对您目前的设计很不满意?或是急缺一个设计供应商?您的团队最近做的项目需要指导?Only2都很乐意为您解困惑. 或者,你 ...
- hdu 5676 ztr loves lucky numbers(dfs+离线)
Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...
- javascript 将递归转化为循环
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() ...
- 关于safari上的select宽高问题小技,自定义下拉框
之前一直用windows做开发,最近换了个mac,在几经折腾之下,安装完了各种开发工具,IDE等,然后欣然打开自己正在开发的网站.突然发现mac上所有的下拉框都变了,都是默认样式,无论padding, ...
- mybatis于Date和DateTime现场插入
最近,该公司使用MyBatis3做数据持久层,有在该领域Date和DateTime种类,只有在插入数据时属性设置为一个实体Timestamp将相应mysql的DateTime类型.Date会相应mys ...
- Ubuntu的防火墙UFW
这是个简单的防火墙,可以直接在命令行启停,也可安装提图形端gufw *安装 sudo apt-get install ufw gufw *常用命令 sudo ufw enable //启动 ufw d ...
- 解决数据库Operation not allowed when innodb_forced_recovery > 0
解决数据库Operation not allowed when innodb_forced_recovery > 0 请修改my.cnf innodb_force_recovery = 1 修改 ...
- Ajax请求安全性讨论 - Eric.Chen(转)
Ajax请求安全性讨论 - Eric.Chen 时间 2013-07-23 20:44:00 博客园-原创精华区 原文 http://www.cnblogs.com/lc-chenlong/p/3 ...
- js基础-需要注意的地方
---因为跟别的语言很像,所以只记录要注意的地方 1.== 和 === 的区别 ===要求类型也相等 "5"==5 = ture "5"===5 = false ...
- Qt调用外部程序QProcess通信
mainwindow.cpp文件: -------------------------------- #include "mainwindow.h" #include " ...