为了避免混淆。做例如以下规定,下面代码若不加特殊说明都执行于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++结构变量数据对齐问题的更多相关文章

  1. 结构体的数据对齐 #pragma浅谈

    之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef ...

  2. C语言结构体变量字节对齐问题总结

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...

  3. 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

  4. C/C++数据对齐汇总

     C/C++数据对齐汇总  这里用两句话总结数据对齐的原则: (1)对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才干获得最好的性能: (2)如果len为结构体中长度最长的变量,s ...

  5. CSAPP阅读笔记-struct, union, 数据对齐-来自第三章3.9的笔记-P183-P191

    1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次 ...

  6. C语言-结构体内存对齐

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  7. 数据对齐 posix_memalign 函数详解

    对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...

  8. [置顶] 什么是C语言结构体字节对齐,为什么要对齐?

    一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   ...

  9. data structure alignment(数据对齐)

    概述: 数据对齐指数据在计算机内存中排放和获取的方式.包含三个方面:数据对齐(data alignment).数据结构填充(data alignment).打包(packing) 如果数据是自然对齐的 ...

随机推荐

  1. IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求

    IIS7.0下 HTTP 错误 404.15 - Not Found 请求筛选模块被配置为拒绝包含的查询字符串过长的请求   IIS7.0下查询条件太多时,会报错,因为IIS 7对于Query Str ...

  2. Nginx FastCGI的运行原理

    http://www.cnblogs.com/yinshoucheng-golden/p/6474034.html

  3. [Winform]WebKit.Net使用

    摘要 在项目中使用了cefsharp,最后发现在触屏电脑上面,如果长按文本内容,会经常性的崩溃,发现是cefsharp的问题,最后也等不及了.然后就换了webkit.net这个开源的浏览器内核. 关于 ...

  4. mac 刻录ISO系统盘

    今天本本系统坏了,手头上又没有U盘PE工具,只有MAC和光驱,只好在MAC上下载系统ISO刻录,我是直接点ISO文件,右键刻录到光盘,刻录好之后放到本本上发现不能引导,再把光盘放回MAC上一看,光盘里 ...

  5. Git 的 WindowsXP安装

    文章1: http://blog.sina.com.cn/s/blog_5063e4c80100sqzq.html 一.安装必要客户端 1. TortoiseGit http://tortoisegi ...

  6. git服务器的建立——Git折腾小记

    转自:http://blog.csdn.net/xsl1990/article/details/25486211 如果你能看到一些sshd相关的进程信息,则说明你已经有这个服务了,否则(或者你想更新的 ...

  7. IOS应用提交所需的ICON

    如果提交的ipa包中,未包含必要的Icon就会收到类似的通知,为什么偏偏是Icon-76呢? 因为我们开发的游戏,默认是支持iphone以及ipad的,根据官方提供的参考 Icon-76.png是必须 ...

  8. 深入探索 JUnit 4

    开始之前 关于本教程 引入 Java 5 注释为 JUnit 带来了显著改变,使它从一个受广大开发人员了解和喜爱的测试框架转变成了一个更为精简但却不那么为人熟知的框架.在本教程中,我将探讨 JUnit ...

  9. Lp空间

    在数学中,Lp空间是由p次可积函数组成的空间:对应的ℓp空间是由p次可和序列组成的空间.它们有时叫做勒贝格空间,以昂利·勒贝格命名(Dunford & Schwartz 1958,III.3) ...

  10. 统计学中RR OR AR HR的区别

    一.相对危险度(RR)——队列研究中分析暴露因素与发病的关联程度 队列研究是选择暴露及未暴露于某一因素的两组人群,追踪其各自的发病结局,比较两组发病结局的差异,从而判定暴露因素与疾病有无关联及关联大小 ...