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) 如果数据是自然对齐的 ...
随机推荐
- 《Go语言实战》摘录:7.1 并发模式 - runner
7.1 并发模式 - runner
- stanford CS DB 课程 数据库系统实现
http://infolab.stanford.edu/db_pages/classes.html CS145: Introduction to Databases CS245: Databa ...
- Running Jenkins behind Nginx
original : https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Nginx In situations wh ...
- spring集成jpa【为什么有 persistant.xml 文件呢?】
原文地址: http://www.cnblogs.com/javahuang/archive/2012/12/19/2824633.html spring集成JPA的其中一种方式 JPA和hibern ...
- Xcode5和6共存时,如何发布应用到商店
如何你和我一样手贱安装了Xcode6,同时又需要发布应用到商店时,你会发现打好的包是通不过审核的.验证报错: unable to validate application archives of ty ...
- 解决ADB server didn't ACK问题
ADB server didn't ACK | 浏览:7400 | 更新:2013-08-11 21:19 1 2 3 4 5 6 7 分步阅读 当我们通过eclipse开发Android应用时,会连 ...
- 使PropertyGrid控件的属性值可以显示多行的方法
第一步:重写UITypeEditor的GetEditStyle方法: 第二部:重写UITypeEditor的EditValue方法: 具体实现如下: using System; using Syste ...
- ASP.NET MVC:Form Authentication 相关的学习资源
看完此图就懂了 看完下面文章必须精通 Form authentication and authorization in ASP.NET Explained: Forms Authentication ...
- HTTP协议--MyWebServer
HTTP协议 HTTP协议是一种Web通信协议,通过特定的规则来实现服务器跟客户端的通信.HTTP协议有这样几个特点: (1)面向无连接的,一次只能处理一个请求,HTTP1.0服务器解析完客户端请求并 ...
- mysql 比较函数和操作符
MYSQL之中的比较函数和操作符: 1.[NOT] BETWEEN ... AND ... Check whether a value is within a range of values 说明: ...