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保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...
随机推荐
- NLog 2.0.0.2000 使用实例
原文地址:http://www.cnblogs.com/sorex/archive/2013/01/31/2887174.html ---------------------------------- ...
- pyqt QTreeWidget例子学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import * from Py ...
- IOS 判断设备类型
- (NSString*)deviceString { // 需要#import "sys/utsname.h" struct utsname systemInfo; uname( ...
- ubuntu 配置jdk
shawn@e014-anle-lnx:~$ sudo su # chmod 777 jdk-6u27-linux-i586.bin # ./jdk-6u27-linux-i586.bin # mv ...
- 《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf
mbuf的主要用途是保存子进程和网络接口间互相传递的用户数据.但mbuf也用于保存其它各种数据:源于目的地址.插口 选项等等. 以下介绍我们要遇到的四种类型的mbuf,它们根据在成员m_flag中填写 ...
- ajaxFileUpload SyntaxError: syntax error
在使用ajaxFileUpload上传文件时,Chrome没问题,IE和Firefox出错,Firefox报SyntaxError: syntax error错误 JS代码例如以下: $.ajaxFi ...
- [HeadFirst-JSPServlet学习笔记][第二章:高层概述]
第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...
- Android 加速Gradle构建项目
1. 升级gradle 进入项目文件夹$project/gradle/wrapper/gradle-wrapper.properties, 使用最新的gradle. 修改替换为最新的 distribu ...
- Dreamwaver 使用root用户连接不上远程服务器
我用dreamweaver连接远程服务,开始用的是root用户登录的,但是连接不上.网上查了一下,解决教程非常复杂,我就不列出来了. 后来我想了一下,之前我有连接过.我感觉可能是用户的问题,于是我在远 ...
- 从C到C++的升级
C++的语言类型 C++是静态的强类型语言. 静态语言:数据类型在编译期间检查,因此在写程序时需要声明变量的类型 强类型语言:强调数据类型,不同的数据类型间的转换需要进行强制类型转换 C与C++的关系 ...