在C语言编程中,有时为了达到减少运行的时间的目的,需要浪费一些空间;而有时为了节省空间,使它的运行时间增长。而字节对齐则是为了访问效率,用空间换取时间。

要掌握字节对齐,首先得明确一下四个概念:

1.基本数据类型的自身对齐值

在32位系统下基本数据类型有其自身的对齐值:

char  1个字节

short  2个字节

Int    4个字节

double  8个字节

2.程序指定的对齐值

用#pragma(value)显式指定对齐值value

3.自定义类型的自身对齐值

即结构体或类的成员自身对齐的最大值

4.自定义类型的有效对齐值

自定义类型的自身对齐值和指定对其中最小的值

#include<stdio.h>

typedef struct Test

{

char a;

double b;

int c;

}Test;

void main()

{

printf("sizeof(Test) = %d\n",sizeof(Test));

}

对于Test结构体来说,首先先列出来结构体中数据成员数据类型的大小:

char a占4个字节,double b占8个字节,int c占4个字节。求出结构体的大小分两个步骤:

1.从结构体的第一个元素往下看,下面的数据的大小是上面数据大小的整数倍,如b的大小为8,而a的大小为4,a不为b的整数倍,所以给a补4个字节,使为b的整数倍。注意上面的概念为这个数据上面的所有类型大小之和。

2.看是否与自定义类型的对齐值对齐。上面已经解释过了自定义类型的对齐值即结构体或类的成员自身对齐的最大值,对于这个例子来说,double数据类型的大小为Test结构体中最大的,所以Test结构体的对齐值为8.所谓对齐,就是看所有数据大小之和是否是自定义类型的对齐值的整数倍。

从上面我们发现,当数据排放位置不同,结构体所占大小会有所变化,当自定义类型中的元素按类型的大小从小到大排列时,所占空间最小。

当结构体中嵌套结构体时不要慌,只要把构体看成一个数据元素,求解顺序跟上面的步骤是一样的。

当结构体按一个字节对齐时,结构体大小就是各成员自身大小之和。

当程序用#pragma(value)指定对齐值为value时,就要考虑有效的对齐值,如上所言:自定义类型的自身对齐值和指定对其中最小的值,这是什么意思呢?就拿上面的例子来说,如果指定对齐的value为4的话,自定义类型自身的对齐值为8,但是程序指定对齐值为4,所以他的有效对齐值为二者中最小的那个,即结构体的有效对齐值为4.针对这个例子,b占8个字节,a占一个字节,c占4个字节,所以给a补齐3个字节,所以结构体的总大小就是16个字节,是4的整数倍,不再需要补齐。因此最终结构体的大小就是16.

当内嵌结构体有名字时,结构体上升为类型,不占空间大小,而内嵌结构体有名字时,可以简单地看做其内部数据成员,不过要受到内嵌结构的约束,并且内嵌结构体自身也要对齐。

C语言之字节对齐的更多相关文章

  1. 转载:C语言的字节对齐及#pragma pack的使用

    C语言的字节对齐及#pragma pack的使用   C编译器的缺省字节对齐方式(自然对界) 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员 ...

  2. 【C语言】字节对齐(内存对齐)

    数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...

  3. 【C语言】字节对齐问题(以32位系统为例)

    1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...

  4. C语言学习 - 字节对齐

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

  5. C语言:内存字节对齐详解[转载]

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  6. C语言:内存字节对齐详解

    转:http://blog.csdn.net/arethe/article/details/2548867 一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论 ...

  7. C语言中内存对齐方式

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  8. <摘录>字节对齐(强制对齐以及自然对齐)

    struct {}node; 32为的x86,window下VC下sizeof(node)的值为1,而linux的gcc下值为0: 一.WINDOWS下(VC--其实GCC和其原理基本一样,象这种问题 ...

  9. C语言的struct/union字节对齐

    C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...

随机推荐

  1. 迁移到MariaDB galera

    迁移到MariaDB galera [已注销] [已注销] -- :: [安装] ====== https://downloads.mariadb.org/mariadb/repositories/ ...

  2. POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

    http://blog.csdn.net/shiyuankongbu/article/details/9202373 发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接 ...

  3. POJ 1477

    #include <iostream> #define MAXN 100 using namespace std; int _[MAXN]; int main() { //freopen( ...

  4. jenkins配置及使用中出现的问题

    安装中遇到的问题: 1.linux中最好用普通用户安装tomcat和jenkins,用普通用户启动tomcat,否则jenkins工作空间不会在普通用户下,而线上自动发布部署时,是不允许用root用户 ...

  5. php截取字符串中的关键字,并高亮显示

    <?php $str = "hahaceshi测试一下关键字高亮显示,以及长字符串截取的问题!"; $key = "关键字"; $r = sub_key_ ...

  6. ​浅谈Asp.net的sessionState

    见:http://my.oschina.net/kavensu/blog/330436

  7. Linux之proc详解

    1. /proc目录    Linux内核提供了一种通过/proc文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  8. MCU晶体旁边电容的作用及振荡电路的分析

    绝大多数的MCU爱好者对MCU晶体两边要接一个22pF附近的电容不理解,因为这个电容有些时候是可以不要的.参考很多书籍,讲解的很少,往往提到最多的是起稳定作用,负载电容之类的话,都不是很深入理论的分析 ...

  9. sql server UI怎么设置自增加id?

    设置表结构的时候,设置标识列就可以了啊 来自为知笔记(Wiz)

  10. Clearing Floats清除浮动--clearfix的不同方法的使用概述

    清除浮动早已是一个前端开发人员必学的一课.毫无疑问,多年来,我们已经接触过多种清除浮动的方法,现在“clearfix methods”越来越被大家熟知.在深入剖析“clearfix”的多种用法之前,我 ...