C++结构变量数据对齐问题
为了避免混淆。做例如以下规定,下面代码若不加特殊说明都执行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为
char占一个字节
int占四个字节
double占八个字节。
两个样例
请问以下的结构体大小是多少?
struct Test
{
char c ;
int i ;
};
这个呢?
struct Test1
{
int i ;
double d ;
char c ;
};
在发布答案之前先看一下对齐的规则。
对齐规则
一般来说,结构体的对齐规则是先按数据类型自身进行对齐,然后再按整个结构体进行对齐。对齐值必须是2的幂。比方1,2。 4, 8。 16。
假设一个类型按n字节对齐,那么该类型的变量起始地址必须是n的倍数。
比方int按四字节对齐,那么int类型的变量起始地址一定是4的倍数。比方0x0012ff60。0x0012ff48等。
数据自身的对齐
数据自身的对齐值通常就是数据类型所占的空间大小。比方int类型占四个字节,那么它的对齐值就是4
整个结构体的对齐
整个结构体的对齐值通常是结构体中最大数据类型所占的空间,比方以下这个结构体的对齐值就是8,由于double类型占8个字节。
struct Test2
{
int i ;
double d ;
};
样例答案
有了上面的基础。再回过头去看看一開始的两个样例
先看结构体Test
1 c是char类型,按1个字节对齐
2 i是int类型。按四个字节对齐。所以在c和i之间实际上空了三个字节。
整个结构体一共是1 + 3(补齐)+ 4 = 8字节。

再看Test1
i是int类型。按4字节对齐
d是double类型,按8字节对齐,所以i和d之间空了4字节
c是char类型。按1字节对齐。
所以整个结构体是 4(i) + 4(补齐)+ 8(d) + 1(c) = 17字节。注意!还没完,整个结构体还没有对齐。由于结构体中空间最大的类型是double。所以整个结构体按8字节对齐,那么终于结果就是17 + 7(补齐) = 24字节。
书写结构体的建议
我们对Test1做一点修改
struct Test1
{
char c ;
int i ;
double d ;
};
这时Test1的大小就变成了16,而不是24了,节省了8个字节!
可见结构体中成员的书写顺序对结构体大小的影响还是非常大的。一个好的建议是,依照数据类型由小到大的顺序进行书写。
怎样改动结构体的对齐值
使用预处理指令
#pragma pack(num)
num是结构体的对齐值,比方以下的样例按四个字节对齐。
#pragma pack(4)
怎样查看结构体的对齐值
使用预处理命令
#pragma pack(show)
该命令来查看当前的对齐值,可是要注意的是,结果是以warning的形式输出的,所以要在VS的警告窗体中才看得见。例如以下
warning C4810: value of pragma pack(show) == 8
C++结构变量数据对齐问题的更多相关文章
- 结构体的数据对齐 #pragma浅谈
之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef ...
- C语言结构体变量字节对齐问题总结
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...
- 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- C/C++数据对齐汇总
C/C++数据对齐汇总 这里用两句话总结数据对齐的原则: (1)对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才干获得最好的性能: (2)如果len为结构体中长度最长的变量,s ...
- CSAPP阅读笔记-struct, union, 数据对齐-来自第三章3.9的笔记-P183-P191
1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次 ...
- C语言-结构体内存对齐
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- 数据对齐 posix_memalign 函数详解
对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...
- [置顶]
什么是C语言结构体字节对齐,为什么要对齐?
一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的. ...
- data structure alignment(数据对齐)
概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的 ...
随机推荐
- RDMA over TCP的协议栈工作过程浅析
http://blog.chinaunix.net/uid-140205-id-2849342.html
- SpringMVC介绍之视图解析器ViewResolver
在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视图解析器.当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMV ...
- MySQL5.6的my.ini配置
下面这个配置在现网服务器上跑了两年了,里面多项参数都有调整过,这个算是最终的一个配置,这个配置不一定适合每种项目,仅供参考. 如果MySQL出现异常:Out of memory 需要修改这几个参数: ...
- SQL Server 2008 安装教程
http://www.downcc.com/tech/4135.html 序列号:Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYB
- cocos2d-x基本元素
from://http://www.cnblogs.com/ArmyShen/p/3239664.html 1.CCDirector(导演类) 控制游戏流程的主要类,主要负责设定游戏窗口.切换场景.暂 ...
- String Matching(poj1580)
/*String Matching Description It's easy to tell if two words are identical - just check the letters. ...
- Java获取URL链接的文件类型
问题发生: Java从网络批量读取图片并保存至本网站服务器后再插入文章中 今天转入一篇文章 http://news.qq.com/a/20170605/045860.htm 发现图片未能成功上传 查看 ...
- 福尔摩斯基本演绎法第一季/全集Elementary迅雷下载
本季Elementary Season 1 第一季(2012)看点:<福尔摩斯:基本演绎法>由CBS出品,根据<福尔摩斯>系列改编,地点从19世纪大英帝国国势鼎盛的时期搬到了2 ...
- 天蝎第一季/全集Scorpion迅雷下载
英文译名 Scorpion (第1季) (2014-秋季播出)CBS.本季看点:<天蝎>双名蝎子故事描述一个高深莫测的计算机专家和一群同样具备天才头脑的国际计算机黑客共同组建全球防御网络, ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...